【问题标题】:Routing table for multilingual web site多语言网站的路由表
【发布时间】:2014-04-28 16:32:14
【问题描述】:

我正在尝试制作一个多语言的 ASP.NET MVC 站点。 这是我需要 URL 的样子

www.mysite.com/home -> 必须是英文并且调用 Home 控制器的 Index 动作

www.mysite.com/test -> 必须是英文并且调用Test控制器的Index动作

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

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 条记录。

【问题讨论】:

  • 它们是两种不同的路由模式,所以我认为您将需要两条不同的路由。我真的不认为那是“不优雅”。
  • 我担心路由表的数据量会是它需要的两倍。
  • 差别可以忽略不计。
  • 是的 Ant P,可能是真的……我只是在想,如果有更好的选择……

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


【解决方案1】:

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

app.UseRequestLocalization(...);

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

如果您不更改这些值,您的 URL 将如下所示:

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

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2011-10-08
    • 2015-07-19
    • 2013-12-11
    • 2016-02-16
    相关资源
    最近更新 更多