ASP.NET Core Blazor globalization and localization状态:
Blazor's
@bind
functionality performs formats and parses values for display based on the user's current culture.
The current culture can be accessed from theSystem.Globalization.CultureInfo.CurrentCulture property
.
这个说法是对的,但问题是,文化必须在使用之前设置(或者可能每次刷新 DOM 时)。
为了演示,我将使用标准的 blazor 计数器应用程序。让我们修改
Counter.razor
@page "/counter"
@using System.Globalization;
<h1>Counter</h1>
<input type="text" @bind="currentDate" />
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private DateTime currentDate = DateTime.Now;
private int currentCount = 0;
private void IncrementCount() {
if (currentCount < 2) Utils.SetCCDateFormat();
currentCount++;
}
public class Utils {
public static void SetCCDateFormat() {
var cc = CultureInfo.CurrentCulture.Clone() as CultureInfo;
cc.DateTimeFormat.ShortDatePattern = "dd-yyyy-m";
CultureInfo.CurrentCulture = cc;
CultureInfo.CurrentUICulture = cc;
}
}
}
结果是:
按服务器默认文化。
dd-yyyy-m
我试图修改
OnAfterRender
中的日期, OnInitialized
没有成功。我发现,唯一可用的解决方案是在 Razor 标记的乞求上设置格式。@{Utils.SetCCDateFormat();}
有没有办法修改 CurrentCulture 以使其在 blazor 电路中持久化?
观察到的行为是正确的还是错误?
编辑
到目前为止我发现了什么
可以在中间件中设置区域性属性 (
CultureInfo.CurrentCulture
) 之前 blazor 端点已创建,并且更改在电路生命周期内是持久的。当我们修改CurrentCulture
在组件生命周期方法中,更改只是暂时的(直到方法结束)。我对问题的理解是
CurrentCulture
,但这不会影响设置存储,因此当调用另一个事件方法(其他线程)时,将使用原始文化。 所以似乎问题是:如何在已经创建的电路文化设置中修改它?
也许这是不可能的,有必要进行完全刷新(再次通过导航启动请求)并使用中间件来设置修改后的区域性。文化储存存在只是我的猜想,我没有任何引用支持。
非常感谢 Tyeth 和 Ashquzzaman 的帮助,但我并没有将他们的尝试作为答案。
最佳答案
Ashquzzaman 答案的第二部分(在 OR 之后)暗示了正确的路径。
内置的 ASP.Net Core 本地化中间件将是你最好的 friend :
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1#localization-middleware
您可以依赖默认包含的 CookieRequestCultureProvider,并通过基于每个用户为您的登录用户设置 cookie(我建议在登录时您将可以访问用户存储的首选项),您可以覆盖默认浏览器请求的语言(或系统默认作为最后的手段)。
RequestLocalizationProviders 的列出顺序在发布的链接上,并建议查询字符串可以覆盖可以覆盖浏览器首选项的 cookie:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1#cookierequestcultureprovider
The CookieRequestCultureProvider DefaultCookieName returns the default cookie name used to track the user's preferred culture information. The default cookie name is .AspNetCore.Culture.
The cookie format is c=%LANGCODE%|uic=%LANGCODE%, where c is Culture and uic is UICulture, for example:
c=en-UK|uic=en-US
您绝对应该按照 Ashquzzaman 的建议阅读有关全局化和本地化的 blazor 部分:
https://docs.microsoft.com/en-us/aspnet/core/blazor/globalization-localization?view=aspnetcore-3.1
关于c# - 如何修改 Blazor(服务器)中的当前文化日期格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60736406/