C# 在管线中使用区域性参数更改区域性

C# 在管线中使用区域性参数更改区域性,c#,asp.net-core,asp.net-core-3.1,C#,Asp.net Core,Asp.net Core 3.1,在Asp.Net 3.1应用程序上,我在启动时具有以下本地化功能: application.UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("pt"), SupportedCultures = new[] { new CultureInfo("en"), new CultureInfo("pt") }, Supporte

在Asp.Net 3.1应用程序上,我在启动时具有以下本地化功能:

  application.UseRequestLocalization(new RequestLocalizationOptions {
    DefaultRequestCulture = new RequestCulture("pt"),
    SupportedCultures = new[] { new CultureInfo("en"), new CultureInfo("pt") },
    SupportedUICultures = new[] { new CultureInfo("en"), new CultureInfo("pt") }
  });

  application.UseEndpoints(x => {
    x.MapDefaultControllerRoute();
  });
我正在控制器上使用属性路由:

[HttpGet("about")]
public IActionResult Index() => View();
我能够通过以下方式查看正确文化中的内容:

/about?culture=pt
/about?culture=en
但我希望将区域性作为管线参数,因此我将其更新为:

[HttpGet("{culture?}/about")]
public IActionResult Index() => View();
但是,当我访问以下内容时,区域性不会改变:

/pt/about
/en/about

如何执行此操作?

开箱即用,
UseRequestLocalization
支持以下命令:

  • QueryStringRequestCultureProvider
  • Cookier-RequestCultureProvider
  • AcceptLanguageHeaderRequestCultureProvider
  • 通过将
    “{culture?}”
    添加到
    HttpGet
    约束,您已经将其转换为路由参数。这是受支持的,但必须进行配置。下面是一个例子:

    var requestLocalizationOptions = new RequestLocalizationOptions {
        DefaultRequestCulture = new RequestCulture("pt"),
        SupportedCultures = new[] { new CultureInfo("en"), new CultureInfo("pt") },
        SupportedUICultures = new[] { new CultureInfo("en"), new CultureInfo("pt") }
    };
    
    requestLocalizationOptions.RequestCultureProviders.Add(
        new RouteDataRequestCultureProvider());
    
    application.UseRequestLocalization(requestLocalizationOptions);
    
    如果您希望首先检查
    RouteDataRequestCultureProvider
    ,请将其添加为第一个提供程序:

    requestLocalizationOptions.RequestCultureProviders.Insert(
        0, new RouteDataRequestCultureProvider());
    
    内置扩展方法使用与上面相同的实现。使用如下所示的方法:

    requestLocalizationOptions.AddInitialRequestCultureProvider(
        new RouteDataRequestCultureProvider());
    

    您是否尝试过使用
    选项配置
    RequestLocalizationOptions
    RouteDataStringKey
    的默认值是
    “culture”
    ,但如果您的route参数设置为其他值,您将如何设置它。您的建议几乎有效,但它会破坏路由属性。路由开始是控制器/操作,而不是我定义的属性路由