2

我发现路由有些奇怪...

我正在 Visual Studio Web Express 2012 中测试 MVC3 应用程序

  • 我创建了一个新的 MVC3 应用程序来隔离问题
  • 我在默认路由之前添加了以下路由:

        routes.MapRoute(
            "default_localization",
            "{language}/{country}/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    
  • 然后没有任何其他更改(创建项目后没有任何区域,只有初始文件),我运行了应用程序,乍一看一切正常。由于它是一个新应用程序,因此页面顶部有两个链接:

    • 关于

操作链接如下所示:

<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>

然后这就是正在发生的事情:

  • 当浏览器 URL 为:http://localhost:54870/

    • 主页链接是:http://localhost:54870/
    • 关于链接是:http://localhost:54870/Home/About

    HTML

    <li><a href="/">Home</a></li>
    <li><a href="/Home/About">About</a></li>
    

    哪个没问题

  • 但点击 About 链接后,浏览器 URL 为:http://localhost:54870/Home/About

    • 主页链接变为:http://localhost:54870/Home/About
    • 关于链接变为:http://localhost:54870/Home/About/Home/About

    即使链接混乱,他们仍然会执行正确的操作。

    HTML

    <li><a href="/Home/About">Home</a></li>
    <li><a href="/Home/About/Home/About">About</a></li>
    

如果我删除我的自定义路由,一切都会按预期工作

  • 为什么会这样?

  • 我该如何解决?

4

2 回答 2

2

我刚发现问题

基本上我阅读了几篇路由文章,最后我明白了,我的问题是我的自定义路由总是在我点击 About 链接后被拾取

为什么?

让我们考虑一下:

当我的 URL 为 时http://localhost:54870/,我的自定义路由没有被选中,因为我没有 {language} 和 {country} 的默认值,因此我的路由不匹配

但是,当我的 URL 是http://localhost:54870/Home/About我的自定义路由时,我的自定义路由总是被选中,因为路由引擎假设 Home/About 是 {language} 和 {country} 段,并且因为我有 {controller} 和 {action} 的默认值,所以路由只是一个匹配

好吧,我吸取了教训,我学到了更多关于路由的知识。将来我计划在定义路线时遵循 KISS 原则

于 2012-08-22T08:38:25.637 回答
0

尝试用以下内容替换您的路线:

routes.MapRoute(
    "default_localization",
    "{language}/{country}/{controller}/{action}/{id}",
    new { language = "en", country = "US", controller = "Home", action = "Index", id = UrlParameter.Optional }
);

看看这是否有效。

希望这对您有所帮助。

于 2012-08-22T00:43:15.427 回答