我需要为我的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”测试了路线作为第一条路线的约束,我得到了相同的结果。
答案 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。