在控制器asp.net-core中获取当前文化

Joh*_*Ace 22 asp.net asp.net-mvc visual-studio-code

我已经为我的观点设置了文化并在控制器中改变了文化,但我似乎无法找到如何知道我目前在控制器中使用的文化,我正在寻找类似的东西:

public class HomeController : Controller {
  public async Task<IActionResult> Index()
  {
      // Something like the next line
      var requestCulture = GetRequestedCulture()
      return View();
  }
}
Run Code Online (Sandbox Code Playgroud)

感谢你的帮助

Joh*_*Ace 36

答案是在Request Object上,这是代码:

public async Task<IActionResult> Index() {
    // Retrieves the requested culture
    var rqf = Request.HttpContext.Features.Get<IRequestCultureFeature>();
    // Culture contains the information of the requested culture
    var culture = rqf.RequestCulture.Culture;
    return View();
}
Run Code Online (Sandbox Code Playgroud)

  • 这与“CultureInfo.CurrentCulture”有何不同? (9认同)
  • @NickG我仔细检查过,它确实存在,你使用的是什么版本?我的是2.2 (2认同)

HMZ*_*HMZ 13

ASP.Net 核心 3.1:

如果配置正确,我可以确认这是有效的(请参阅第二个代码块)

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
Run Code Online (Sandbox Code Playgroud)

在您的启动类中,将此添加到Configure方法中:

            IList<CultureInfo> supportedCultures = new List<CultureInfo>
            {
                new CultureInfo("en-US"), //English US
                new CultureInfo("ar-SY"), //Arabic SY
            };
            var localizationOptions = new RequestLocalizationOptions
            {
                DefaultRequestCulture = new RequestCulture("en-US"), //English US will be the default culture (for new visitors)
                SupportedCultures = supportedCultures,
                SupportedUICultures = supportedCultures
            };

            app.UseRequestLocalization(localizationOptions);
Run Code Online (Sandbox Code Playgroud)

然后用户可以通过调用这个动作来改变文化:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult SetCulture(string culture, string returnUrl)
        {
            HttpContext.Response.Cookies.Append(
                CookieRequestCultureProvider.DefaultCookieName,
                CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
                new CookieOptions { Path = Url.Content("~/") });

            if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
            {
                return LocalRedirect(returnUrl);
            }

            return RedirectToAction("Index", "Home");
        }
Run Code Online (Sandbox Code Playgroud)


yon*_*bat 6

JohnnysAce答案有效。如果您只是想以一种简单的方式来获取当前的文化,那么它通常会在.net中完成:

CultureInfo uiCultureInfo = Thread.CurrentThread.CurrentUICulture;
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
Run Code Online (Sandbox Code Playgroud)

如果要使用IRequestCultureFeature(请参阅JohnnyAces答案;由于依赖项注入和更好的可测试性),则必须在Startup.cs中进行配置。微软在这里提供了一个示例https://github.com/aspnet/Entropy/blob/2fcbabef58c2c21845848c35e9d5e5f89b19adc5/samples/Localization.StarterWeb/Startup.cs

  • 在执行“app.UseRequestLocalization(options)”之后,这似乎确实有效 (2认同)
  • @SeriousM Thread.CurrentThread.CurrentUICulture 在经典的 .net 框架应用程序中使用如此广泛,因此框架人员使其工作。异步的东西也是 .net 框架(经典)的一部分,我记得它曾经是你描述的问题,但 MS 决定用 V4.6“修复”它(修复它不是正确的词,因为它不是错误)。 (2认同)
  • 来自MS WEb的@SeriousM:从针对.NET Framework 4.6的应用程序开始,即使任务在线程池线程上异步运行,调用线程的区域性也会由每个任务继承.https://docs.microsoft.com/en -我们/ dotnet /标准/并行编程/基于任务的异步编程 (2认同)
  • @SeriousM 如果他们不这样做,那将意味着字符串格式也会受到错误文化的影响-因此他们实际上没有选择,这必须起作用。 (2认同)

Lap*_*mir 5

此代码用于获取 ASP 核心控制器中的当前文化:

public string GetCulture() => $"CurrentCulture:{CultureInfo.CurrentCulture.Name}, CurrentUICulture:{CultureInfo.CurrentUICulture.Name}";
Run Code Online (Sandbox Code Playgroud)