以下是使用ASP.NET MVC 3.0路由重现一个非常奇怪的问题的必要代码:
Global.asax.cs中的路由注册:
routes.MapRoute("History", "Customer/History", new {controller = "User", action = "History", someParam = UrlParameter.Optional});
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
这里我们声明一条到用户历史的路线。但在URL中我们想要“客户”而不是“用户”。另请注意参数someParam
。控制器User
确实存在且具有操作History
。
现在在视图中使用:
<a href="<%= Url.Action("History", "User") %>">History</a>
<a href="<%= Url.Action("History", "User", new { someParam="qqq" }) %>">History with param</a>
我在Url.Action()
而不是Html.ActionLink()
只是为了清晰起见。
这是结果 - 视图的这部分是如何呈现的:
<a href="/Customer/History">History</a>
<a href="/User/History?someParam=qqq">History with param</a>
现在问题很明显 - 没有参数的网址已正确解析,而带参数的网址以“/ User”而不是“/ Customer”开头。
问题:
这有什么解决方法吗?我的意思是有任何方法可以得到最终结果:
<a href="/Customer/History">History</a>
<a href="/Customer/History?someParam=qqq">History with param</a>
答案 0 :(得分:1)
我怀疑它变得困惑,因为您的客户路线没有列出额外的价值,但默认的那个。试试这个:
routes.MapRoute("History", "Customer/History/{someParam}", new {controller = "User", action = "History", someParam = UrlParameter.Optional});
或者预先获得查询字符串链接语法,这个:
routes.MapRoute("History", "Customer/History/{id}", new {controller = "User", action = "History", id = UrlParameter.Optional});
在第二种情况下,您在创建链接时不会为id提供值(您对Url.Action的调用不应该更改)。