【问题标题】:MVC3 Routing strange behaviorMVC3 路由奇怪的行为
【发布时间】:2012-08-22 00:07:38
【问题描述】:

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

我正在 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链接后,浏览器网址为:http://localhost:54870/Home/About

    • 主页链接变为:http://localhost:54870/Home/About
    • 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>
    

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

  • 为什么会这样?

  • 我该如何解决?

【问题讨论】:

  • 您没有为国家和语言设置默认值。也许这导致了“混乱”,......
  • 我在想类似的事情,但我的逻辑告诉我,由于我的路线包含两个标记(语言和国家),因此该路线不应匹配仅指定控制器和操作标记的路线,因此应该选择默认路线......但这没有发生。我错过了什么?
  • 你试过在浏览器中查看html页面的源代码吗?您的 About 中有什么链接?
  • 我刚刚添加了两种情况下呈现的 HTML 以及 ActionLink 的生成方式

标签: c# asp.net-mvc asp.net-mvc-3


【解决方案1】:

我刚刚发现问题

基本上我看了几篇路由文章,终于明白了,我的问题是我的自定义路由总是在我点击关于链接后被拾取

为什么?

让我们考虑一下:

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

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

嗯,我吸取了教训,我学到了更多关于路由的知识。以后打算关注KISS principle when defining routes

【讨论】:

  • 你的语言是什么样的? “en-US”等?您可以使用 [a-z]-[A-Z] 之类的约束来使其匹配..
  • @SimonWhitehead 是的,确实有限制,我也解决了它,但我真的很想学习和理解根本问题。
【解决方案2】:

尝试用类似这样的方式替换您的路线:

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

看看这是否有效。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 2017-09-01
    • 2016-09-25
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多