ASP.NET MVC Url.Action и значение имени маршрута - PullRequest
15 голосов
/ 29 октября 2011

Я использую asp.net mvc 2 и создаю локализацию на основе маршрутов.

  1. мой маршрут выглядит так: {culture}/{controller}/{action}
  2. Я иду на свой домашний контроллер: en/Home/Index
  3. в моем домашнем контроллере есть ссылки на другие контроллеры:

    <a href='<%= Url.Action("Prods","Products") %>' >Products</a>
    <a href='<%= Url.Action("Index","About") %>' >About</a>
    

Первый сгенерированный код: /en/Products/Prods, но второй сгенерированный: /Home/Index

Я не могу понять, почему Url.Action пропускает параметр маршрута {culture}, когда я передаю значение Index в действии аргумента?Что я делаю не так?

Конфигурация маршрута:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute("Login", // Route name
                "{controller}/Index", // URL with parameters
                new { controller = "Login", action = "Index" } // Parameter defaults
                ).RouteHandler = new SingleCultureMvcRouteHandler();

routes.MapRoute("Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
               );      

Затем

foreach (Route r in routes)
{
    if (!(r.RouteHandler is SingleCultureMvcRouteHandler))
    {
       r.RouteHandler = new MultiCultureMvcRouteHandler();

       r.Url = "{culture}/" + r.Url;

       if (r.Defaults == null)
       {
          r.Defaults = new RouteValueDictionary();
       }

       r.Defaults.Add("culture", "en");

       if (r.Constraints == null)
       {
          r.Constraints = new RouteValueDictionary();
       }

       r.Constraints.Add("culture", new CultureConstraint(cultures));
    }
 }

Спасибо за помощь

Ответы [ 2 ]

45 голосов
/ 29 октября 2011

При генерации URL лучше всего всегда использовать имена маршрутов, потому что таким образом вы не вдаваетесь в тонкости алгоритма, используемого для выбора маршрута, который будет использоваться для генерации URL.

MyСовет, если вам не следует использовать Url.Action, а вместо этого использовать Url.RouteUrl, что позволяет указать имя маршрута, который следует использовать для построения URL.

Всегда используяИмена маршрутов также делают ваш код более устойчивым к изменениям, например, вы можете добавлять новые маршруты, не беспокоясь о том, что они могут сломать ваш существующий код для генерации URL.

1 голос
/ 29 октября 2011

В целях построения ссылки Url.Action любое действие Index без токена id будет соответствовать маршруту Login.Маршрут входа в систему использует SingleCultureMvcRouteHandler, поэтому культура не будет добавлена ​​к этим ссылкам.

...