MVC3路由奇怪的行为

时间:2012-08-22 00:07:39

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

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

我在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>

然后就是这样:

  • 当浏览器网址为: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>
    

    哪个没关系

  • 但点击了“关于”链接后,浏览器网址为: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>
    

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

  • 为什么会这样?

  • 我该如何解决?

2 个答案:

答案 0 :(得分:2)

我刚发现问题

基本上我读了几篇路线文章,最后我知道了,我的问题是我的自定义路线被选中总是在我点击关于链接后

为什么?

让我们考虑一下:

当我的网址为http://localhost:54870/时,我的自定义路由未被提取,因为我没有{language}和{country}的默认值,因此我的路线不匹配

但当我的网址为http://localhost:54870/Home/About时,我的自定义路由始终被选中,因为路由引擎认为Home / About是{language}和{country} segments < / em>因为我有{controller}和{action}的默认值,所以溃败只是匹配

嗯,我吸取了教训,并且学到了更多关于路由的知识。将来我打算遵循KISS principle when defining routes

答案 1 :(得分:0)

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

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

看看是否有效。

希望这对你有所帮助。