ASP.NET MVC Url.Action 和路由名称值
Posted
技术标签:
【中文标题】ASP.NET MVC Url.Action 和路由名称值【英文标题】:ASP.NET MVC Url.Action and route name value 【发布时间】:2011-12-17 19:25:01 【问题描述】:我正在使用 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
在参数操作中传递值Index
时会跳过culture
路由参数?我做错了什么?
路线配置:
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));
感谢大家的帮助
【问题讨论】:
如果您包含完整的路线配置,则更容易找到问题。 @João Angelo 感谢您的回复,请寻找更新 @marc_s 谢谢,我在所有路线之后添加它:r.Url = "culture/" + r.Url; 查看Phil Haack's Route debugger,这是一个很好的工具,可以帮助您了解选择了哪些路线以及为什么选择... @marc_s 非常感谢有用的路由调试器链接 【参考方案1】:在生成 URL 时,您最好的选择是始终使用路由名称,因为这样您就不会进入用于选择将用于生成 URL 的路由的算法的细微之处。
我的建议是不要使用Url.Action
,而是使用Url.RouteUrl
,它允许您指定应该用于构造 URL 的路由名称。
通过始终使用路由名称,您还可以使您的代码对更改更加健壮,例如,您可以添加新路由而不必担心它们可能会破坏您现有的 URL 生成代码。
【讨论】:
【参考方案2】:为了构建 Url.Action 链接,任何没有 id
标记的 Index
操作都将匹配 Login
路由。 Login 路由使用 SingleCultureMvcRouteHandler,因此文化不会被预先添加到这些链接中。
【讨论】:
以上是关于ASP.NET MVC Url.Action 和路由名称值的主要内容,如果未能解决你的问题,请参考以下文章
使用 Url.Action (ASP.NET MVC) 将分号附加到 href URL
通过 Url.Action 将参数发送到 asp.net MVC 中的控制器
无法显示带有 asp.net mvc url.action 链接的引导对话框
ASP.NET MVC Razor Url.Action 在 Internet Explorer 8 中不起作用