c# - 如何修改 Blazor(服务器)中的当前文化日期格式?
问题描述
ASP.NET Core Blazor 全球化和本地化状态:
Blazor 的
@bind
功能根据用户当前的文化执行格式并解析显示值。
当前区域性可以从System.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
但没有成功。我发现,唯一可用的解决方案是在剃刀标记的乞求上设置格式。
@{Utils.SetCCDateFormat();}
有没有办法修改 CurrentCulture 以在 blazor 电路中持久化?
观察到的行为是正确的还是错误?
编辑
到目前为止我发现了什么
可以在创建 blazor 终结点之前在中间件中设置区域性属性 ( CultureInfo.CurrentCulture
),并且更改在电路生命周期内保持不变。当我们在组件生命周期方法中进行修改时,更改只是暂时的(直到方法结束)。CurrentCulture
我对问题的理解是
- 创建电路时,它将当前文化存储在某处
- 服务器的线程数有限
- 需要时将线程分配给电路,并且当前区域性由开始时存储的内容设置
- 可以修改
CurrentCulture
,但这不会影响设置存储,因此当调用另一个事件方法(其他线程)时,将使用原始文化。
所以似乎问题是:如何在已经创建电路文化设置时修改它?
也许这是不可能的,有必要进行完全刷新(通过导航再次启动请求)并使用中间件来设置修改后的文化。文化储存存在只是我的猜想,我没有任何参考来支持它。
非常感谢 Tyeth 和 Ashiquzzaman 的帮助,但我不会将他们的尝试作为答案。
解决方案
1)使用中间件
例子:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//your Code
app.Use(async (context, next) =>
{
var culture = CultureInfo.CurrentCulture.Clone() as CultureInfo;// Set user culture here
culture.DateTimeFormat.ShortDatePattern = "dd-yyyy-m";
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
// Call the next delegate/middleware in the pipeline
await next();
});
//your Code
}
2) 带服务的自定义中间件:
服务 :
public interface ICultureService
{
void SetCCDateFormat();
}
public class CultureService : ICultureService
{
public void SetCCDateFormat()
{
CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.DateTimeFormat.ShortDatePattern = "dd-yyyy-m";
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
}
中间件:
public class CultureMiddleware
{
private readonly RequestDelegate _next;
public CultureMiddleware(RequestDelegate next)
{
_next = next;
}
public Task Invoke(HttpContext context, ICultureService culture)
{
culture.SetCCDateFormat();
return this._next(context);
}
}
启动:
public void ConfigureServices(IServiceCollection services)
{
//Your Code
services.AddScoped<ICultureService, CultureService>();
//Your Code
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//Your Code
app.UseMiddleware<CultureMiddleware>();
//Your Code
}
文化.剃刀:
@page "/culture"
@inject ICultureService CultureService
<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) CultureService.SetCCDateFormat();
currentCount++;
}
}
3)如果您可以更改应用程序的默认文化,请使用本地化中间件。Blazor 服务器应用正在使用本地化中间件进行本地化和全球化。请求的当前文化在本地化 Middleware中设置。该Startup.Configure
方法中启用了本地化中间件。必须在任何可能检查请求文化的中间件之前配置本地化中间件(例如,app.UseMvcWithDefaultRoute()
)。
例子:
var culture = new CultureInfo("en-US");
culture.DateTimeFormat.ShortDatePattern = "dd-yyyy-MM";
var supportedCultures = new List<CultureInfo> { culture };
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(culture, culture),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCultures
});
推荐阅读
- c - 使用蒙特卡罗模拟多线程计算 Pi
- android - 颤振正在更新而不使用 setState
- linux - vim搜索并用不同的字符串替换连续出现的字符串
- java - 从其他类访问方法到 Activity
- git - 无法使用 `git checkout` 命令忽略本地更改
- ruby-on-rails - 使用 Devise 创建第二个用户后,优点确实停止工作
- c++ - CMake对类的未定义引用
- html - eclipse中的http 404错误
- angular - 一个组件中的多个材料分页在 Angular 中不起作用
- machine-learning - 如何进行 ANOVA 测试以比较不同聚类算法的性能