c# - 如何修改 Blazor(服务器)中的当前文化日期格式?

标签 c# asp.net-core blazor blazor-server-side asp.net-core-3.1

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 the 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没有成功。我发现,唯一可用的解决方案是在 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

  • QueryStringRequestCultureProvider
  • CookieRequestCultureProvider **
  • AcceptLanguageHeaderRequestCultureProvider

  • 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/

    相关文章:

    visual-studio-2015 - 缺少脚手架 ASP.Net Core

    c# - 使用 Blazor 中的按钮向左/向右滚动

    c# - 在 blazor 中改变组件属性的正确方法

    c# - 我如何在 C# 窗口存储应用程序中使用键移动图像

    c# - PowerShell 和服务器管理器模块的跨平台系统库引用

    azure - ASP.NET 5 Web 应用程序作为 Azure Web 角色?

    asp.net-core - 我是否需要内联网应用程序的 SSL 证书

    visual-studio - Blazor 调试 - IIS 不更新 wwwroot 文件

    c# - 如何在 wpf 中自动将高度设置为 itemscontrol?

    c# - 使用 LINQ 改进方法