Asp.Net MVC使用默认语言本地化路由

时间:2016-10-19 21:31:34

标签: asp.net-mvc url-routing globalization

我需要为我的Asp.Net MVC应用程序提供特定于语言的路由。该语言应该是Url Path(http://myapp/en/Blog)的一部分,当省略该语言时,必须使用默认语言。

http://myapp/en/Blog - >博客的英文版 http://myapp/Blog - >默认(葡萄牙语)语言版本的博客

为了解决这个问题,我创建了两个路径:

            routes.MapRoute(
            name: "Default.lang",
            url: "{lang}/{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            constraints: new { lang = @"^[a-zA-Z]{2}$" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

路由按预期工作但当我尝试使用Url.RouteUrl方法获取替代语言网址时,我得到了奇怪的结果。

示例1 - 路径:/

url.Action("Index", "Blog") // returns "/Blog" that is OK
url.Action("Index", "Blog", new  { lang = "en" }); // returns "/en/Blog" that is also OK

示例2 - 路径:/ en

url.Action("Index", "Home") // returns "/en/Blog" (??????????) Not OK
url.Action("Index", "Home", new  { lang = "en" }); // returns "/en/Blog" that is OK

正如您所看到的,当我访问网址http://myappurl/en并尝试使用Url.Action方法而不传递任何路由值(与Url.RouteUrl相同的结果)时,我得到了错误的结果

有谁知道我的路线有什么问题?

[编辑] 我不确定问题是否与路线有关,因为我已经使用“en”测试了路线作为第一条路线的约束,我得到了相同的结果。

1 个答案:

答案 0 :(得分:0)

在System.Web.Mvc和System.Web.Routing源代码中进行一些挖掘之后,我发现这种行为是预料之中的。我认为它被设计为在虚拟目录内运行的应用程序中正确工作。

这可以在this answer中确认,我在研究其他人是否有与虚拟路径和路径解析相同的问题时发现。

解决方法

使用具有Url.RouteUrl方法的命名路由解析,该方法具有不同的实现并按预期工作。

示例

var blogDefaultUrl = url.RouteUrl("Default", new {action = "Index", controller = "Blog"});
var blogLangageSpecifictUrl = url.RouteUrl("Default.lang", new { action = "Index", controller = "Blog", lang = language });

我避免使用命名路由,因为我的应用程序设计比上面演示的要复杂一点。出于这个原因,我必须在运行时发现与Request.Url匹配的路由,从那时起我调用RouteUrl来获取内容的替代语言URL。