我正在创建一个支持多种语言的MVC5网站。应用程序的结构很复杂,所以我只使用属性路由。 RouteConfig.cs
非常简单:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}
我希望通过在网站名称后面添加语言标识符来保留网址中的语言信息。对于英语(默认语言),URL应保持"清洁"。这是一个例子:
http://test.com/foo/1/bar/2
http://test.com/de/foo/1/bar/2
我的第一次尝试是为每个控制器使用两个RoutePrefix
属性:
[RoutePrefix("foo")]
[RoutePrefix("{lang}/foo")]
但是MVC不允许为控制器使用多个RoutePrefix
属性。
所以现在我根本没有使用RoutePrefix
属性,并为每个控制器操作指定完整路由:
[Route("foo/{a}/bar/{b}")]
[Route("{lang}/foo/{a}/bar/{b}")]
有没有更好的方法来处理lang
路线?理想情况下,我只想在一个地方指定,而不是每个控制器。
PS。我通过解析自定义过滤器中的语言路径来设置当前线程文化。
答案 0 :(得分:1)
我发现最简单的解决方案(至少对于ASP.NET MVC 5.2)是使用可选参数的默认值。
例如,如果英语是您的默认语言,您可以在Controller上使用单个属性:
[RoutePrefix("{lang=en}/foo")]
或Action上的单个属性:
[Route("{lang=en}/foo/bar")]
请注意,可选的URI参数(例如{lang?}
)如果位于网址的开头则不起作用。
答案 1 :(得分:0)
如果所有其他方法都失败,那么我建议您按原样保留默认路由,并将语言存储在查询参数
中对于英语,您的默认语言,网址将保持“干净”。
http://test.com/foo/1/bar/2
但是对于其他语言,您将lang
作为查询参数
http://test.com/foo/1/bar/2?lang=De-DE
然后在自定义过滤器中,检查查询参数是否存在。如果是,那么改变文化以匹配。否则使用默认语言。
另外:您应该使用5个字符编码而不是2个char全球化ISO代码。 De-DE而不是DE或fr-FR而不是FR
答案 2 :(得分:0)
你基本上需要三件事:
Html.ActionLink
和/或Url.Action
扩展方法)。有关详细信息和代码示例,请参阅this answer。
(两者都是用C#编写的 - 附属免责声明:我制作了这些样本)
有关其他信息和更多示例,您还可以阅读this blog post我就此主题撰写的文章。