OjM*_*OjM 5 asp.net-mvc razor tag-helpers asp.net-core asp.net-core-tag-helpers
在ASP.Net Core中,是否可以在视图模型中自动转换驼峰案例属性名称,以便在使用标签助手时在相应的标签中插入空格?
如果我的视图模型看起来像这样...
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Display(Name = "Referral Date")]
public DateTime ReferralDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
似乎很多额外的配置都应用了数据注释,例如
[显示(名称=“名字”)]
在单词之间简单地插入一个空格。最好使用Tag Helpers默认插入空格,以避免这种手动配置和可能的错别字。
如果不能,自定义标签助手可以在这种情况下提供帮助,如果可以,它将如何工作?
您可以通过构建和注册自定义显示元数据提供程序来实现此目的。有些库会对属性名称执行更复杂的“人性化”,但是您可以使用一些可靠的正则表达式来实现一些非常有用的东西。
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 = () => SplitCamelCase(propertyName);
}
}
private static string SplitCamelCase(string str)
{
return Regex.Replace(
Regex.Replace(
str,
@"(\P{Ll})(\P{Ll}\p{Ll})",
"$1 $2"
),
@"(\p{Ll})(\P{Ll})",
"$1 $2"
);
}
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;
}
}
Run Code Online (Sandbox Code Playgroud)
该IsTransformRequired方法确保您仍然可以在需要时使用修饰属性覆盖提供程序。
AddMvcOptions通过以下方法在启动时注册提供程序IMvcBuilder:
builder.AddMvcOptions(m => m.ModelMetadataDetailsProviders.Add(new HumanizerMetadataProvider()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
768 次 |
| 最近记录: |