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

Asp.Net MVC localizing routes with default language

我需要为我的 Asp.Net MVC 应用程序提供特定于语言的路由。该语言应该是 Url 路径 (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 方法获取替代语言时,我得到了奇怪的结果 urls。

例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

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

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

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

在深入研究 System.Web.Mvc 和 System.Web.Routing 源代码后,我发现这种行为是意料之中的。我认为它被设计为在虚拟目录中 运行ning 的应用程序中正常工作。

这可以在 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。