Asp.Net Core 中基于请求的 Razor 页面本地化

Request-based Localization of Razor pages in Asp.Net Core

我的应用程序由位于美国的服务器托管。我住在英国。 当我在本地打开页面时,我可以根据我居住的地方看到日期 dd/mm/yyyy 的正确格式,但是,当我将应用程序部署到 Azure 美国应用程序服务并在同一个 Web 浏览器中打开它时,我可以查看 DateTime 格式更改为美国文化 mm/dd/yyyy

剃须刀页面.cshtml中的部分代码:

<br>
        <h2>Subscription</h2>
        <hr />

        <dl class="row">
            <dt class="col-sm-3">
                @Html.DisplayNameFor(model => model.Subscription.StartDate)
            </dt>
            <dd class="col-sm-9" id="StartDate">
                @Html.DisplayFor(model => model.Subscription.StartDate)
            </dd>
            ...

            <dt class="col-sm-3">
                @Html.DisplayNameFor(model => model.Subscription.EndDate)
            </dt>
            <dd class="col-sm-9" id="EndDate">
                @Html.DisplayFor(model => model.Subscription.EndDate)
            </dd>

        </dl>

我试着改变我显示日期的方式,我有一个应用 CultureInfo.InvariantCulture 的想法,但我以某事告终。喜欢

@(Model.Subscription.EndDate.ToString(CultureInfo.InvariantCulture))

但这仍然无济于事。我知道该页面是在服务器上生成的,但是,有什么方法可以根据浏览器的设置而不是服务器一次显示 StartDate/EndDate 吗? 也许我需要使用一些 javascript 扩展来实现我想要的? 是否可以定义一个全局规则来显示整个 RazorPages 应用程序的客户端格式的所有日期? 干杯

您要查找的内容相当于经典 ASP.NET 中的 enableClientBasedCulture:

<system.web>
    <globalization enableClientBasedCulture="true" ... />
</system.web>

对于现代 ASP.Net 应用程序(Owin-based) you need to rely on the Localization middleware 实现(大致)相同的结果。

在你的Startup.cs中:

app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en-US"),
});

虽然有些不同:

  • 经典的enableClientBasedCulture只使用HTTPAcceptheader来确定文化,而新的中间件也会从querystring和cookie中尝试。

  • 经典 enableClientBasedCulture 将映射到 OS 支持的任何请求的文化,而新的中间件要求所有支持的文化都是 pre-defined。

有关更详细的讨论,请参阅 https://github.com/dotnet/aspnetcore/issues/2649