ASP.NET 核心MVC,设置线程文化没有效果

ASP.NET Core MVC, set thread culture does not have effect

我在处理多语言网站。

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

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

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

ASP.Net 核心,它更侧重于异步编码,这意味着每个部分的任务是 运行。所以控制器动作是 1 个任务。 RedirectToPage 是另一个任务(或多个任务)。

任务 运行 在不同的线程中(通过 TaskSchedular)使用一个池(当任务完成时 re-using 个线程)。因此不能保证它在同一个线程中是 运行。

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

CultureInfo newCulture = new CultureInfo(culture);

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

然后获取Index

中的CurrentThread.CurrentCulture
var currentCulture = Thread.CurrentThread.CurrentCulture;