.Net核心本地化视图:Linq表达式中的IViewLocalizer

tuc*_*chy 4 c# linq linq-expressions asp.net-core asp.net-core-localization

我在.net核心写mvc应用程序,我有本地化问题,我不知道如何将IViewLocalizer添加到我的网格视图.这是我的代码:

@using NonFactors.Mvc.Grid;
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@model IEnumerable<WeegreeEmployeeFormsCore.Models.Employee>

@(Html
    .Grid(Model)
    .Build(columns =>
    {
        columns.Add(model => model.Name).Titled(Localizer["Name"]).Sortable(true).Filterable(true);
        columns.Add(model => model.Surname).Titled(Localizer["Surname"]).Sortable(true).Filterable(true);
        columns.Add(model => model.EmploymentDate).Titled(Localizer["Hired"]).Sortable(true).Filterable(true);
        columns.Add(model => model.Country).Titled(Localizer["Country"]).Filterable(true).Sortable(true).Filterable(true);
        columns.Add(model => model.EmploymentForm).Titled(Localizer["EmploymentForm"]).Filterable(true);
        columns.Add(model => $"<a href=\"{Url.Action("Edit", "Form")}/{model.EmployeeId}\">{Localizer["Edit"]}</a>").Encoded(false);
        columns.Add(model => $"<a href=\"{Url.Action("Details", "Form")}/{model.EmployeeId}\">Details</a>").Encoded(false);


    })
    .Pageable(pager =>
    {
        pager.PagesToDisplay = 10;
        pager.CurrentPage = 1;
        pager.RowsPerPage = 10;
    })
    .Sortable()
    .Empty("No data found")

)
Run Code Online (Sandbox Code Playgroud)

当我{}用来插入内部表达model.EmployeeId它工作 - 链接工作,但当我想使用Localizer来获取题字Edit/Edytuj/??????? etc.而不是我在我看来得到这个: Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString

Dan*_*.G. 5

那是因为 IViewLocalizer["Foo"]返回一个LocalizedHtmlString而不是一个字符串.因此,当您将其包含在字符串插值表达式中时,它将调用其ToString方法.由于ToString尚未在该类中重新定义,因此默认Object.ToString()实现返回类型名称:

var foo = Localizer["Foo"].ToString();
//foo gets assigned "Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString"
Run Code Online (Sandbox Code Playgroud)

Razor知道如何在呈现页面时处理LocalizedHtmlString实例,因此这会按预期呈现:

<p>Hello @Localizer["World"]</p>
//renders <p>Hello World</p>
Run Code Online (Sandbox Code Playgroud)

如果要手动连接本地化字符串,则需要确保获取LocalizedHtmlString.Value属性:

@{
    var text = $"Hello {Localizer["World"].Value}";
}
<p>@text</p>
//renders <p>Hello World</p>
Run Code Online (Sandbox Code Playgroud)

相比之下,与你的方法,而无需调用.Value:

@{
    var text = $"Hello {Localizer["World"]}";
}
<p>@text</p>
//renders <p>Hello Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString</p>
Run Code Online (Sandbox Code Playgroud)

  • 请小心使用“.Value”,如[文档所述](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.localization.localizedhtmlstring.value?view=aspnetcore-5.0# Microsoft_AspNetCore_Mvc_Localization_LocalizedHtmlString_Value)它是 - “原始资源字符串,在使用任何构造函数参数进行格式化之前。”。因此,使用 `Localizer["some key {0} and {1}", some, argument]` 将不起作用,并且会返回 `some key {0} 和 {1}` 而不是格式化字符串。 (2认同)