我一直在本地开发一个MVC应用程序(IIS Express)并定期去IIS 7.5以进行测试。
我刚刚在Global.asax.cs文件中添加了一个新命名的Route:
routes.MapRoute(
"MyCustomRoute", // Route name
"{documentID}/{year}", // URL with parameters
new { controller = "Documents", action = "CurrentVersion", year = DateTime.Now.Year }, // Parameter defaults
new { documentID = @".*\d+.*" } // Regex matches only where documentID contains numerical values.
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Documents", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
我使用“MyCustomRoute”设置了一个Html.RouteLink,并且在我的本地计算机上运行良好。 但是,当我在Web服务器上运行它时,Html.RouteLink正在生成一个空链接。另外,如果我直接在浏览器中输入URL,它会给出404。
好像路线没有登记。我错过了什么?
答案 0 :(得分:0)
我们不可能在没有看到代码的情况下调试您的路线,如果您使用正确的工具,您将很容易看到正在发生的事情以及匹配的内容。
Phil Haack构建了一个名为 RouteDebugger 的优秀开源工具。您可以get it through NuGet阅读有关如何在http://haacked.com/archive/2011/04/12/routedebugger-2.aspx使用它的信息。 RouteMagic and is at Codeplex和git提供了此项目的更强大版本。详情请见this blog post<强>更新强>
根据您的正则表达式,由于贪婪,您的documentID未匹配。 .*
将匹配所有内容,因此您永远不会有机会匹配\d+
,因为前面的模式将会蚕食所有匹配项。你可以在http://www.regular-expressions.info/repeat.html阅读有关正则表达式贪婪和懒惰的内容。
更新2
正则表达式可能是我在编程方面最糟糕的事情,而且我认识到这个问题的唯一原因是因为我对他们如此苛刻以至于我遇到了大约一百万次的相同问题。话虽如此,我认为 @"(.*?)(\d+?)(.*?)"
会做到这一点。它应该没有任何括号(如@".*?\d+?.*?"
),但我喜欢将它们留在那里以便于阅读(主要是因为我对它们非常苛刻)。