多语言网站的路由表

时间:2014-04-28 16:32:15

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

我正在尝试创建一个多语言的ASP.NET MVC站点。 以下是我需要网址的方式

www.mysite.com/home - >必须是英语并调用家庭控制器的索引操作

www.mysite.com/test - >必须是英文并调用测试控制器的索引操作

www.mysite.com/es/home - >必须是西班牙语并调用家庭控制器的索引操作

www.mysite.com/es/test - >必须是西班牙语并调用测试控制器的索引操作

这是我的溃败表的样子。 我不喜欢的是,我需要为同一件事提供2个条目。

        routes.MapRoute(
            name: "controller",
            url: "{controller}",
            defaults: new { lang = "en", controller = "Home", action = "Index" }                
        );

        routes.MapRoute(
            name: "multilang-controller",
            url: "{lang}/{controller}",
            defaults: new { lang = "en", controller = "Home", action = "Index" },
            constraints: new { lang = "en|es|de|fr" }
        );

我在考虑只有这样的东西

        routes.MapRoute(
            name: "controller",
            url: "{lang}\{controller}",
            defaults: new { lang = "en", controller = "Home", action = "Index" },
            constraints: new { lang = "en|es|de|fr" }
        );

但这不起作用,因为当我致电www.mysite.com/test时,它会将test映射到lang,因为它违反了约束,所以会抛出404。

必须有更优雅的方法来做到这一点,而不是每个案例都有2条记录。

1 个答案:

答案 0 :(得分:0)

您可能需要使用QueryStringRequestCultureProvider。在public void Configure(IApplicationBuilder app, ...)致电

app.UseRequestLocalization(...);

传递RequestLocalizationOptions.的实例在此选项实例中找到现有的QueryStringRequestCultureProvider实例,并将其QueryStringKey/UIQueryStringKey属性设置为您需要的值。默认值为“文化”和“ui-culture”。

如果您不更改值,您的网址将如下所示:

http://localhost:5000/?culture=fr-FR&ui-culture=fr-BE

但是,如果您需要URL段而不是查询字符串参数,则必须实施您自己的OWIN中间件来处理该场景。

“引擎盖下”会发生什么:提供者检查请求URL的查询部分,如果它包含参数,则设置相应的文化。这有点过于简单了。实际上,被覆盖的DetermineProviderCultureResult()确定所请求的文化并将ProviderCultureResult返回到RequestLocalizationMiddleware。在其Invoke()方法中,它接收ProviderCultureResult并设置CultureInfo.CurrentCultureCultureInfo.CurrentUICulture。然后URL进一步传递并到达MVC。

有了这个说,也许你会感觉更好,使用大多数开箱即用的解决方案,并且只有在没有可用的实现你自己的东西时。

有关此主题的更多信息: http://www.jerriepelser.com/blog/how-aspnet5-determines-culture-info-for-localization