ASP.NET MVC Url.Action и значение имени маршрута
Я использую asp.net mvc 2 и создаю локализацию на основе маршрутов.
- мой маршрут выглядит следующим образом:
{culture}/{controller}/{action}
- Я иду на свой домашний контроллер:
en/Home/Index
-
Мой домашний контроллер имеет ссылки на другие контроллеры:
<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
в аргументе action? Что я делаю неправильно?
Конфигурация маршрута:
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));
}
}
Спасибо за помощь
Ответы
Ответ 1
При создании URL-адресов ваши лучшие параметры - всегда использовать имена маршрутов, потому что таким образом вы не попадаете в тонкости алгоритма, используемого для выбора маршрута, который будет использоваться для создания URL-адреса.
Мой совет, если вы не используете Url.Action
и вместо этого используйте Url.RouteUrl
, который позволяет указать имя маршрута, следует использовать для создания URL-адреса.
Всегда используя имена маршрутов, вы также делаете свой код более надежным для изменений, например, вы можете добавлять новые маршруты, не беспокоясь о том, что они могут нарушить существующий код для генерации URL.
Ответ 2
Для создания ссылки Url.Action любое действие Index
без токена id
будет соответствовать маршруту Login
. В маршруте Login используется SingleCultureMvcRouteHandler, поэтому культура не будет добавлена к этим ссылкам.