首页 > 解决方案 > Razor Html.DisplayFor() 没有选择正确的本地化资源

问题描述

Razor 不会根据当前线程文化返回本地化资源,我不知道为什么。它总是返回中性 resx 文件中的字符串。

PurchaseOrderModel.cs:

public class PurchaseOrderModel : ProfileSpecificEntityModel {
    [Display(ResourceType = typeof(PurchaseOrderModelRes), Name = "ExpectedDeliveryOn")]
    public DateTimeOffset? ExpectedDeliveryOn { get; set; }
}

在同一个文件夹中,我有:

PurchaseOrderModelRes.resx-> 中性资源。访问修饰符设置为“public”。 PurchaseOrderModelRes.fr.resx-> 本地化的法语资源。

采购订单报告.cs:

<div>@Html.DisplayNameFor(purchaseOrder => purchaseOrder.ExpectedDeliveryOn)</div>

PurchaseOrderController.cs:

[HttpGet]
public async Task<IActionResult> PurchaseOrdersReportAsync([FromQuery] PurchaseOrderListQueryOptionsModel queryOptions) {
    CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("fr"); //Should use *.fr.resx files.
    CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("fr");
    PaginatedList<PurchaseOrder> purchaseOrders = await _purchaseOrderService.GetPurchaseOrdersAsync(CurrentUser, queryOptions.ToQueryOptions());
    PaginatedListModel<PurchaseOrderModel> purchaseOrderModels = _paginatedListModelConverter.Convert(purchaseOrders, p => _purchaseOrderModelConverter.Convert(p));
    return View("PurchaseOrderReport", purchaseOrderModels.Items);
}

启动.cs:

services.AddMvc().
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();

标签: c#asp.net-mvcrazorresx

解决方案


通过在 ResourceFilter 中设置区域性而不是控制器操作来解决问题,正如此线程所建议的:ASP.NET MVC (Async) CurrentCulture is not shared between Controller and View

现在文化在控制器和视图之间正确共享。


推荐阅读