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;
我在处理多语言网站。
我有一个局部视图,我的方法是为我的网站设置特定语言。
<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;