0

我一直在本地开发 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。

好像 Route 还没有注册。我错过了什么?

4

1 回答 1

0

我们不可能在不看代码的情况下调试您的路线,如果您使用正确的工具,您将很容易看到正在发生的事情以及正在匹配的内容。

Phil Haack 构建了一个名为RouteDebugger的优秀开源工具。您可以通过 NuGet 获取它,并在http://haacked.com/archive/2011/04/12/routedebugger-2.aspx了解如何使用它。该项目的更强大版本可作为RouteMagic 获得,位于 Codeplexgit中。此博客文章中的详细信息

更新

根据您的正则表达式,由于贪婪,您的 documentID 没有被匹配。 .*将匹配所有内容,因此您将永远没有机会匹配\d+,因为前面的模式将蚕食所有匹配项。您可以在http://www.regular-expressions.info/repeat.html阅读有关正则表达式贪婪和懒惰的信息。

更新 2

正则表达式可能是我在编程方面最糟糕的事情,而我认识到这个问题的唯一原因是因为我对它们太差了,以至于我遇到了大约一百万次同样的问题。话虽如此,我认为 @"(.*?)(\d+?)(.*?)"会成功的。它也应该在没有任何括号的情况下工作(如@".*?\d+?.*?"),但我喜欢将它们保留在那里以提高可读性(主要是因为我不擅长它们)。

于 2012-09-11T12:43:37.937 回答