Asp.net mvc 3 带有可选参数的路由未正确解析

Asp.net mvc 3 带有可选参数的路由未正确解析,asp.net-mvc-3,asp.net-mvc-routing,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}", n

下面是重现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
。控制器
用户
确实存在并且具有操作
历史记录

现在,您可以看到:

<a href="<%= Url.Action("History", "User") %>">History</a>
<a href="<%= Url.Action("History", "User", new { someParam="qqq" }) %>">History with param</a>
现在问题很清楚了-没有参数的URL已正确解决,而带有参数的URL以“/User”而不是“/Customer”开头

问题:

  • 这是正常的行为吗?如果是,为什么路由是这样工作的
  • 有什么解决办法吗?我的意思是,有没有办法得到最终结果:

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

  • 我怀疑它会变得混乱,因为您的客户路线没有列出额外的值,但默认值会列出。试试这个:

    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的调用不必更改)。

    谢谢您的回复。根据您的建议,生成的URL将是
    /Customer/History/qqq
    。然而,我需要的是
    /Customer/History?someParam=qqq
    。有没有办法做到这一点?@Andrei-你可以把{id}放在它上面而不是{someParam},因为你没有给它一个id,它不会把someParam的值放在那里。您不必将someParam添加到路由设置中,只需在实际创建链接时将其作为值添加即可(就像您已经在做的那样)。我已经用第二种形式更新了答案。非常感谢,现在它完全按照预期工作。但是,我仍然不确定添加默认参数是如何解决问题的。为什么原来的路线不合适?它的控制器和操作与Url.action()方法中给出的完全相同,someParam被声明为optinal-一切似乎都正常。。。你能告诉我关于那些可选参数我遗漏了什么吗?@Andrei-我真的不完全明白为什么我自己会这样。我只知道是这样。:)这似乎是由于缺少第三个参数,路由在应该匹配的时候不匹配。在本例中,您并不是在使用{id},但是在那里使用它会让事情变得更快乐。如果让我猜的话,我会同意它认为某个参数适合它,即使它真的不适合。有了这个问题,一切都变得更简单了<代码>routes.MapRoute(“历史”,“客户/历史”,新建{controller=“User”,action=“History”})也能完成这项工作-
    Url.Action(“History”,“User”,new{someParam=“qqq”})
    给出一个预期的Url
    /Customer/History?someParam=qqq
    routes.MapRoute("History", "Customer/History/{id}", new {controller = "User", action = "History", id = UrlParameter.Optional});