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

标签 c# asp.net asp.net-mvc routes attributerouting

我正在创建一个应该支持多种语言的 MVC5 网站。应用程序的结构很复杂,所以我只使用属性路由。 RouteConfig.cs 非常简单:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapMvcAttributeRoutes();
}

我想通过在站点名称后添加语言标识符来保留 URL 中的语言信息。对于默认语言英语,URL 应保持“干净”。下面是一个例子:

http://test.com/foo/1/bar/2
http://test.com/de/foo/1/bar/2

我的第一次尝试是为每个 Controller 使用两个 RoutePrefix 属性:

[RoutePrefix("foo")]
[RoutePrefix("{lang}/foo")]

但是 MVC 不允许为 Controller 使用多个 RoutePrefix 属性。

所以现在我根本不使用 RoutePrefix 属性,而是为每个 Controller 操作指定完整路由:

[Route("foo/{a}/bar/{b}")]
[Route("{lang}/foo/{a}/bar/{b}")]

有没有更好的方法来处理 lang 路由?理想情况下,我只想在一个地方指定,而不是为每个 Controller 指定。

附言。我通过在自定义过滤器中解析语言路由来设置当前线程文化。

最佳答案

我发现最简单的解决方案(至少对于 ASP.NET MVC 5.2 而言)是为可选参数使用默认值。

例如,如果英语是您的默认语言,您可以在 Controller 上使用单个属性:

[RoutePrefix("{lang=en}/foo")]

或操作上的单个属性:

[Route("{lang=en}/foo/bar")]

请注意,如果可选的 URI 参数(例如 {lang?})位于 URL 的开头,则它们将不起作用。

关于c# - 为多语言站点配置 ASP.NET MVC 属性路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35819524/

相关文章:

c# - 如何添加(连接)两个 Google.Protobuf.ByteStrings? C#

asp.net - 我的 App_Themes 文件夹中有一个 CSS 文件 - 如何将它应用到我的 Web 用户控件?

asp.net-mvc - 无法获得有效的 Unity session 生命周期管理器,ASP.NET MVC5

ASP.NET MVC : Weird characters in error page

asp.net-mvc - 如何使用 linq-to-sql 将存储过程结果映射到自定义类?

c# - 捕获控制台退出 C#

c# - 在c#中将图像转换为图形

c# - 抑制 Visual Studio 2015 中的特定分析错误

c# - 如何为 Razor 创建自定义标签助手?

c# - 在用户控件中包含 Css 文件