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



我需要为我的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。方法获取替代语言的url。

例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方法(与Url.RouteUrl结果相同)

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

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

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

这可以在这个答案中得到证实,当我在研究是否有人在虚拟路径和路由解析方面有同样的问题时,我发现。

解决方案

对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 });

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

最新更新