Как контролировать значения маршрутизации - PullRequest
0 голосов
/ 08 января 2012

Может быть, я не понимаю реальную цель маршрутизации asp mvc.Я создал приложение, и теперь мне нужно исправить свой URL, чтобы быть более понятным.Например, у меня есть область Cities с контроллером Home и действие Index.Так что здесь мне нужно URL-адрес, как: localhost/London, но с текущей маршрутизацией я получаю localhost/cityPage/Home.У меня вопрос, могу ли я как-то передать параметр типа city name и сделать URL-адрес, как я хочу?Это моя текущая маршрутизация по умолчанию в Global.asax

routes.MapRoute(
                "Default",
                "{area}/{controller}/{action}/{id}",
                new { area = "CityPage", controller = "Home", action = "Index", id = "" },
                new string[] { "MyProject.Areas.Cities.Controllers" }).DataTokens.Add("area", "Cities");

Новая маршрутизация:

routes.MapRoute(null,
                            "CityPage/{cityName}",
                            new
                            {
                                area = "CityPage",
                                controller = "Home",
                                action = "Index"
                            }
                        );

            routes.MapRoute(
                "Default",
                "{area}/{controller}/{action}/{id}",
                new { area = "CityPage", controller = "Home", action = "Index", id = "" },
                new string[] { "MyProject.WebUI.Areas.CityPage.Controllers" }).DataTokens.Add("area", "CityPage");

Пример ссылки, которую я нажимаю

@Html.ActionLink("City London", "Index", "Home", new { cityName = "London" }, null)

Ответы [ 2 ]

1 голос
/ 08 января 2012

Чтобы направить URL localhost / London к действию Index на HomeController в области Cities, вам нужен маршрут, подобный следующему:

routes.MapRoute(null,
    "{id}",
    new 
    {
        area = "Cities", controller = "Home", action = "Index"
    }
);

Убедитесь, что этот маршрут объявлен до "Default""маршрут в вашем классе CitiesAreaRegistration.cs.

Однако, если в вашем приложении много других маршрутов, добавление такого общего маршрута может привести к разрушению других маршрутов в приложении.Я предлагаю добавить префикс URL, чтобы отделить этот маршрут от других в вашем приложении:

routes.MapRoute(null,
    "cities/{id}",
    new 
    {
        area = "Cities", controller = "Home", action = "Index"
    }
);

Это сделает ваш URL похожим на localhost / towns / London.Это приемлемо?

Обновление 1

Если вы полностью не удалите свое определение маршрута "По умолчанию", у вас фактически будет несколько INBOUND маршрутов, которые сопоставляются с этим действием.У вас будет localhost/cities/London, localhost/cityPage/Home, localhost/cityPage/Home/Index и localhost/cityPage/Home/Index/London, все они будут разрешены для этого действия.Однако, когда MVC решает сгенерировать маршрут OUTBOUND, он выберет первый - localhost / towns / London.

Обновление 2

Если вы хотите, чтобы параметром маршрута было cityName, вы должны сделать это:

routes.MapRoute(null,
    "cities/{cityName}",
    new 
    {
        area = "Cities", controller = "Home", action = "Index"
    }
);

Однако тогда вам придетсяизмените действие Index в HomeController вашей области Cities, чтобы иметь эту подпись:

public ActionResult Index(string cityName)

Изменяя аргумент с id на cityName, вы сообщаете MVC передать этот параметр параметра / маршрута URL методу действия.

Обновление 3

Название вашего района "Города" или "CityPage"?Из предыдущего кода это выглядело так, как будто название вашей области было Города.

Если это CitiesPage, попробуйте это для своего метода действия:

@Html.ActionLink("City London", "Index", "Home", 
    new { area = "CityPage", cityName = "London" })

Окончательный ответ

Я только что воспроизвел это в проекте MVC3,и он работает, как и ожидалось:

  1. Создан новый район с именем "CityPage"
  2. Добавлен HomeController с действием Index в область CityPage
  3. Добавлен индекспросмотр папки CityPage / Views / Home.

CityPageAreaRegistration.cs:

public class CityPageAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "CityPage";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(null,
            "CityPage/{cityName}",
            new { area = "CityPage", controller = "Home", action = "Index" }
        );

        //context.MapRoute(
        //    "CityPage_default",
        //    "CityPage/{controller}/{action}/{id}",
        //    new { action = "Index", id = UrlParameter.Optional }
        //);
    }
}

HomeController.cs:

public class HomeController : Controller
{
    //
    // GET: /CityPage/Home/

    public ActionResult Index(string cityName)
    {
        return View();
    }

}

Index.cshtml:

@{
    ViewBag.Title = "Index";
}
<h2>
    Index</h2>
@Html.ActionLink("City London", "Index", "Home", 
    new { area = "CityPage", cityName = "London" }, null)

Наконец, вот ссылка, сгенерированная ссылкой действия:

<a href="/CityPage/London">City London</a>
0 голосов
/ 08 января 2012

да, вы можете сделать это так, но вы должны сделать следующее:

  1. Убедитесь, что ваш маршрут должен зарегистрироваться до общего маршрута.
  2. Получить информацию о RouteConstraint

http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-custom-route-constraint-cs

Например, попробуйте проверить нужный URL-адрес localhost / London

routes.MapRoute(
                "Default",
                "{id}",
                new { area = "CityPage", controller = "Home", action = "Index", id = "" },
                new string[] { "MyProject.Areas.Cities.Controllers" }).DataTokens.Add("area", "Cities");
...