3

我定义了以下路线

            routes.MapRoute(
            "ItemName",
            "{controller}/{action}/{projectName}/{name}",
            new { controller = "Home", action = "Index", name = "", projectName = "" }
            );

这条路线实际上有效,所以如果我在浏览器中输入

/Milestone/Edit/Co-Driver/Feature complete

它正确地转到 Milestone 控制器、编辑操作并传递值。

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

<%=Url.Action("Edit", "Milestone", new {name=m.name, projectName=m.Project.title})%>

我得到以下网址

Milestone/Edit?name=Feature complete&projectName=Co-Driver

它仍然有效,但不是很干净。有任何想法吗?

4

3 回答 3

5

在 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 != Home 的路由都将匹配第二个路由。

  • 使用 RouteLinks 而不是 ActionLinks,特别是命名您想要的路线,以便它建立正确的链接而不会产生歧义。

于 2008-11-27T19:52:24.247 回答
1

只是为了澄清,这就是我最终解决它的方法,感谢@Brad的回答

<%=Html.RouteLink("Edit", "ItemName", new { projectName=m.Project.title, name=m.name, controller="Milestone", action="Edit"})%>
于 2008-11-28T10:18:27.947 回答
0

你可以试试

Html.RouteLink("Edit","ItemName", new {name=m.name, projectName=m.Project.title});
于 2008-11-27T19:40:26.020 回答