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