我需要为我的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