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

时间:2016-12-22 18:38:07

标签: 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();
  }
}

感谢您的帮助

5 个答案:

答案 0 :(得分:31)

答案在于请求对象,这里是代码:

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();
}

答案 1 :(得分:5)

ASP.Net Core 3.1:

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

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;

在您的启动类中,将其添加到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);

然后,用户可以通过调用以下操作来更改区域性:

        [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");
        }

答案 2 :(得分:3)

JohnnysAce回答有效。如果您只是想要一种简单的方法来获得当前的文化,那么它将在.net:

中一如既往地完成
CultureInfo uiCultureInfo = Thread.CurrentThread.CurrentUICulture;
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;

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

答案 3 :(得分:0)

此代码可用于获取ASP核心控制器中的当前区域性:

{{1}}

答案 4 :(得分:0)

CultureInfo.CurrentCulture命名空间中有一个全局属性System.Globalization,用于获取当前线程的区域性。这个问题可以追溯到.NET Framework 4.0,一直到.NET Core 3.1的当前版本。