ASP.NET Core MVC,设置线程区域性不起作用

时间:2019-05-12 16:19:09

标签: c# asp.net-core-mvc currentculture

我正在处理多语言站点。

我有一个局部视图,该方法是为网站设置特定语言。

<form asp-controller="Language" asp-action="SetLanguage" method="post" class="form-horizontal">
    <label>Language:</label>
    <select name="culture">
        <option value="hu">Magyar</option>
        <option value="eng">English</option>
    </select>
    <button type="submit" class="btn btn-link navbar-btn navbar-link">Change</button>
</form>

在调试的同时,我可以检查区域性设置是否正确,但是当我的RedirectToPage(...)调用时,我再次进行调试,并且我的CurrentThread.CurrentCulture恢复了原来的状态。

public IActionResult SetLanguage(string culture)
{
    string cookieCultureValue = culture;
    Response.Cookies.Append(
        CookieRequestCultureProvider.DefaultCookieName,
        CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(cookieCultureValue)),
        new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
    );

    Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);

    return RedirectToPage("/Index");
}

我该如何解决这个问题? 我可以做这种多语言的事情吗?

1 个答案:

答案 0 :(得分:1)

ASP.Net Core,它更专注于异步编码,这意味着任务是逐个部分运行的。因此,控制器的动作是一项任务。 RedirectToPage是另一个任务(或多个任务)。

使用池(在任务完成时重新使用线程)在不同线程(由TaskSchedular)中运行任务。因此,没有保证它在同一线程中运行。

您可以在SetLanguage方法中尝试使用CultureInfo.DefaultThreadCurrentCulture Property,如下所示:

CultureInfo newCulture = new CultureInfo(culture);

CultureInfo.DefaultThreadCurrentCulture = newCulture;
CultureInfo.DefaultThreadCurrentUICulture = newCulture;

然后在索引中获得CurrentThread.CurrentCulture

var currentCulture = Thread.CurrentThread.CurrentCulture;