无法正确解析带有可选参数的路径

时间:2011-08-19 13:46:52

标签: asp.net-mvc-3 asp.net-mvc-routing

以下是使用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”开头。

问题:

  1. 这是正常行为吗?如果是,为什么路由会这样工作?
  2. 这有什么解决方法吗?我的意思是有任何方法可以得到最终结果:

    <a href="/Customer/History">History</a>
    <a href="/Customer/History?someParam=qqq">History with param</a>
    

1 个答案:

答案 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的调用不应该更改)。