当前位置:  开发笔记 > 后端 > 正文

带有> 1参数的ASP MVC路由

如何解决《带有>1参数的ASPMVC路由》经验,为你挑选了1个好方法。

我定义了以下路线

            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})%>

我得到以下网址

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

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



1> Brad Wilson..:

在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,特别是命名您想要的路由,以便它没有歧义地建立正确的链接.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有