【问题标题】:ASP MVC Routing with > 1 parameter具有 > 1 个参数的 ASP MVC 路由
【发布时间】:2010-09-24 07:50:25
【问题描述】:

我定义了以下路线

            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

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

【问题讨论】:

    标签: asp.net asp.net-mvc url-rewriting


    【解决方案1】:

    在 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,具体命名您想要的路线,以便它建立正确的链接而不会产生歧义。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        你可以试试

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-31
          相关资源
          最近更新 更多