我对 ASP.NET Core Razor Pages 相当陌生,我正在尝试使用IDisplayMetadataProvider
. 我希望我的所有视图都将我的模型属性转换为标签上的“标题大小写”字符串。
例如,我想做这样的事情:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
有了上面的类定义,我想让我的标签在To.TitleCase
我说的任何时候自动使用 Humanizer @Html.DisplayNameFor(...)
:
<div>
@Html.DisplayNameFor(m => m.FirstName)
@Html.DisplayFor(m => m.FirstName)
</div>
<div>
@Html.DisplayNameFor(m => m.LastName): @Html.DisplayFor(m => m.LastName)
</div>
我希望看到:
First Name: Joe
Last Name: Smith
解决方案(更新)
我能够使用 Humanizer 自述文件页面底部的教程在经典的 ASP.NET MVC 中配置它(在此处解释)。在网上浏览了一段时间后,我确实找到了 Michael Whelan的这篇文章:
public class HumanizerMetadataProvider : IDisplayMetadataProvider
{
public void CreateDisplayMetadata(DisplayMetadataProviderContext context)
{
var propertyAttributes = context.Attributes;
var modelMetadata = context.DisplayMetadata;
var propertyName = context.Key.Name;
if (IsTransformRequired(propertyName, modelMetadata, propertyAttributes))
modelMetadata.DisplayName = () => propertyName.Humanize().Transform(To.TitleCase);
}
private static bool IsTransformRequired(string propertyName, DisplayMetadata modelMetaData, IReadOnlyList<object> propertyAttributes)
{
if (!string.IsNullOrEmpty(modelMetaData.SimpleDisplayProperty))
return false;
if (propertyAttributes.OfType<DisplayNameAttribute>().Any())
return false;
if (propertyAttributes.OfType<DisplayAttribute>().Any())
return false;
if (string.IsNullOrEmpty(propertyName))
return false;
return true;
}
}
它对接口采取了一些不同的方法,而不是从类继承。这是挂钩到 ASP.NET Core Razor Pages管道的技巧。这是Startup.cs ConfigureServices(...)
处理程序中所需的代码:
services
.AddRazorPages()
.AddMvcOptions(m => m.ModelMetadataDetailsProviders.Add(new HumanizerMetadataProvider()));
希望这对某人有帮助!