为多语言站点配置ASP.NET MVC属性路由

时间:2016-03-05 20:31:39

标签: c# asp.net asp.net-mvc routing attributerouting

我正在创建一个支持多种语言的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。我通过解析自定义过滤器中的语言路径来设置当前线程文化。

3 个答案:

答案 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)

你基本上需要三件事:

  • 用于处理传入网址的多语言感知路径(如果您使用MVC5或更高版本,您也可以使用基于属性的路由,但我仍然我更喜欢使用全局规则来处理这个问题。)。
  • 一个LocalizationAttribute 来处理这些类型的多语言请求。
  • 在您的应用程序中生成这些网址的帮助方法Html.ActionLink和/或Url.Action扩展方法)。

有关详细信息和代码示例,请参阅this answer

(两者都是用C#编写的 - 附属免责声明:我制作了这些样本)

有关其他信息和更多示例,您还可以阅读this blog post我就此主题撰写的文章。

http://www.ryadel.com/en/html-actionlink-extension-method-written-c-handle-multi-language-routes-asp-net-mvc/