ASP.NET MVC Url.Action和路由名称值

我正在使用asp.net mvc 2并根据路线创建本地化。

  1. 我的路线如下: {culture}/{controller}/{action}
  2. 我去我的家庭控制器: en/Home/Index
  3. 我的家庭控制器视图有一个到其他控制器的链接:

     <a href='https://stackoverflow.com/questions/7938332/asp-net-mvc-url-action-and-route-name-value/' >Products <a href='https://stackoverflow.com/questions/7938332/asp-net-mvc-url-action-and-route-name-value/' >About 

第一个链接生成代码: /en/Products/Prods但第二个生成: /Home/Index

当我在参数动作中传递值Index时,我无法理解为什么Url.Action跳过{culture} route参数? 我究竟做错了什么?

路线配置:

 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)); } } 

谢谢你的帮助

生成URL时,最好的选择是始终使用路由名称,因为这样您就不会深入了解用于选择将用于生成URL的路由的算法的细微之处。

我的建议是,如果您不使用Url.Action ,而是使用Url.RouteUrl ,它允许您指定应该用于构造URL的路由的名称。

通过始终使用路由名称,您还可以使代码对更改更加健壮,例如,您可以添加新路由,而不必担心它们可能会破坏现有的URL生成代码。

出于构建Url.Action链接的目的,任何没有id标记的Index操作都将与Login路由匹配。 Login路由使用SingleCultureMvcRouteHandler,因此不会将文化预先添加到这些链接。