我在路由表中添加了一条新路由:
routes.MapRoute(
"ModuleRoute", // Route name
"Module/{href}", // URL with parameters
new { controller = "Module", action = "GetHtml" }// Parameter defaults
);
我需要这条路线匹配以下网址结构:
/module/123abc.html
问题是它在这个结构上也匹配
/module/Launch/123abc.html
致电链接:
<%: Html.ActionLink("Launch", "Launch", new { href = item.Href })%>
如何阻止这种情况发生?我希望他的第二个结构继续与默认路由匹配。我认为,因为参数的数量不同,这不会是一个问题。
如何更好地过滤我的路线以防止这种情况?
谢谢!
答案 0 :(得分:1)
我同意Max Toro,我已完成一些测试,且该网址与Module/{href}
不匹配。
此:
<%: Html.ActionLink("Launch", "Launch", new { href = item.Href })%>
实际上正在达到默认路线。如果您将默认路线更改为以下内容,则会看到此信息(请注意,ID已更改为href
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{href}", // URL with parameters
new { controller = "Home", action = "Index", href = UrlParameter.Optional } // Parameter defaults
);
所以,这证明它正在通过第一条路线掉落,因为它获得了正确的网址(没有查询字符串)
它正在做什么(当你有id
的常用默认路线时)controller
和action
匹配,但id
不匹配。这没关系 - 路线仍然匹配,但不会离开id
。所有其他值(例如href
)都会附加为查询字符串参数,因此您最终得到:
module/Launch?href=123abc.html
解决问题的方法是添加另一条路线,类似于使用href
代替id
的路线
类似的东西:
routes.MapRoute(
"Launch",
"Module/Launch/{href}",
new { controller = "Module", action = "Launch", href = UrlParameter.Optional }
);