Asp.net ASP MVC路由与>;1参数

Asp.net ASP MVC路由与>;1参数,asp.net,asp.net-mvc,url-rewriting,Asp.net,Asp.net Mvc,Url Rewriting,我定义了以下路线 routes.MapRoute( "ItemName", "{controller}/{action}/{projectName}/{name}", new { controller = "Home", action = "Index", name = "", projectName = "" } ); 这条路线实际上有效,所以如果我在浏览器中键入 /Mil

我定义了以下路线

            routes.MapRoute(
            "ItemName",
            "{controller}/{action}/{projectName}/{name}",
            new { controller = "Home", action = "Index", name = "", projectName = "" }
            );
这条路线实际上有效,所以如果我在浏览器中键入

/Milestone/Edit/Co-Driver/Feature complete
它正确地转到里程碑控制器、编辑操作并传递值

但是,如果我尝试在视图中使用url.action构造链接-

<%=Url.Action("Edit", "Milestone", new {name=m.name, projectName=m.Project.title})%>
它仍然有效,但不是很干净。有什么想法吗?

你可以试试

Html.RouteLink("Edit","ItemName", new {name=m.name, projectName=m.Project.title});

在ASP.NET路由(ASP.NET MVC使用的路由)中构造和匹配路由时,将使用第一个适当的匹配,而不是最贪婪的,并且顺序很重要

因此,如果您有两条路线:

"{controller}/{action}/{id}"
"{controller}/{action}/{projectName}/{name}"
在给定的顺序中,将使用第一个。在本例中,额外的值projectName和name将成为查询参数

事实上,由于您为{projectName}和{name}提供了默认值,因此它与默认路由完全冲突。以下是您的选择:

  • 删除默认路由。如果不再需要默认路线,请执行此操作

  • 首先移动较长的管线,并使其更加明确,使其与默认管线不匹配,例如:

    routes.MapRoute(
        "ItemName",
        "Home/{action}/{projectName}/{name}",
        new { controller = "Home", action = "Index", name = "", projectName = "" }
    );
    
    这样,任何controller==Home的路由都将与第一个路由匹配,任何controller!=家将与第二条路线相配

  • 使用RouteLink而不是ActionLinks,特别是命名您想要的路由,这样它就可以创建正确的链接而不会产生歧义


为了澄清,感谢@Brad的回答,我终于解决了这个问题

<%=Html.RouteLink("Edit", "ItemName", new { projectName=m.Project.title, name=m.name, controller="Milestone", action="Edit"})%>

<%=Html.RouteLink("Edit", "ItemName", new { projectName=m.Project.title, name=m.name, controller="Milestone", action="Edit"})%>