.Net Core Localization View:IViewLocalizer inside Linq 表达式
Posted
技术标签:
【中文标题】.Net Core Localization View:IViewLocalizer inside Linq 表达式【英文标题】:.Net Core Localization View: IViewLocalizer inside Linq expression 【发布时间】:2017-02-09 01:32:24 【问题描述】:我正在 .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")
)
当我使用 插入表达式
model.EmployeeId
时,它可以工作 - 链接正在工作,但是当我想使用 Localizer 获取题词 Edit/Edytuj/змінити etc
时。而不是我认为:
Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString
【问题讨论】:
【参考方案1】:这是因为IViewLocalizer["Foo"]
返回一个LocalizedHtmlString
而不是一个字符串。因此,当您将其包含在字符串插值表达式中时,它正在调用其 ToString 方法。由于该类中尚未重新定义 ToString,因此默认的 Object.ToString()
实现返回类型名称:
var foo = Localizer["Foo"].ToString();
//foo gets assigned "Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString"
Razor 知道如何在渲染页面时处理 LocalizedHtmlString 实例,因此会按预期渲染:
<p>Hello @Localizer["World"]</p>
//renders <p>Hello World</p>
如果您想手动连接本地化字符串,则需要确保获得LocalizedHtmlString.Value
属性:
@
var text = $"Hello Localizer["World"].Value";
<p>@text</p>
//renders <p>Hello World</p>
在不调用.Value
的情况下将其与您的方法进行比较:
@
var text = $"Hello Localizer["World"]";
<p>@text</p>
//renders <p>Hello Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString</p>
【讨论】:
在我看来,这不是设计使然,事实上,如果感觉像是微软的错误。 documentation中没有说明 小心使用.Value
作为the documentation says 它是“原始资源字符串,在使用任何构造函数参数格式化之前。”。所以使用Localizer["some key 0 and 1", some, arguments]
将不起作用,将返回some key 0 and 1
而不是格式化的字符串。【参考方案2】:
因为接受的答案在插值查询方面可能会有点误导。
Localizer
在内部查找文本并通过string.Format
运行它。这使我们能够使用pseudoText > This text will be 0 by the 1
之类的字符串来提供它。
修改大括号中的内容
@Localizer["pseudoText", "transformed", "lozalizer"].
这将输出This text will be transformed by the lozalizer
【讨论】:
【参考方案3】:在尝试将具有多个值的本地化传递到局部视图时,我遇到了类似的问题。我可以使用WriteTo() 方法解决它。
@
var writer = new StringWriter();
Localizer["heading", Model.UserName].WriteTo(writer, HtmlEncoder.Default);
var heading = writer.ToString();
@await Html.PartialAsync("_ModalHeader", new ModalHeaderModel Heading = heading )
【讨论】:
以上是关于.Net Core Localization View:IViewLocalizer inside Linq 表达式的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.Net Core 中使用 SharedLocalizer 和 javascript
Linux 中 vi /etc/sysctl.conf 如何编辑
ASP.NET Core 3.1 路由(Route、ActionName)本地化怎么做?
csharp 使用DXA .NET的admin / sitelocalization操作检查Localization对象。将此操作放在管理控制器中,将视图放在t中
csharp 使用DXA .NET的admin / sitelocalization操作检查Localization对象。将此操作放在管理控制器中,将视图放在t中