首页 > 解决方案 > 如何修改 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;
        }
    }

} 

结果是:

我试图修改 中的日期OnAfterRenderOnInitialized但没有成功。我发现,唯一可用的解决方案是在剃刀标记的乞求上设置格式。

@{Utils.SetCCDateFormat();}

有没有办法修改 CurrentCulture 以在 blazor 电路中持久化?

观察到的行为是正确的还是错误?

编辑

到目前为止我发现了什么

可以在创建 blazor 终结点之前在中间件中设置区域性属性 ( CultureInfo.CurrentCulture),并且更改在电路生命周期内保持不变。当我们在组件生命周期方法中进行修改时,更改只是暂时的(直到方法结束)。CurrentCulture

我对问题的理解是

所以似乎问题是:如何在已经创建电路文化设置时修改它?

也许这是不可能的,有必要进行完全刷新(通过导航再次启动请求)并使用中间件来设置修改后的文化。文化储存存在只是我的猜想,我没有任何参考来支持它。

非常感谢 Tyeth 和 Ashiquzzaman 的帮助,但我不会将他们的尝试作为答案。

标签: c#asp.net-coreblazorblazor-server-sideasp.net-core-3.1

解决方案


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

推荐阅读