ASP .Net Core自定义标签助手将CamelCase属性转换为空格

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默认插入空格,以避免这种手动配置和可能的错别字。

如果不能,自定义标签助手可以在这种情况下提供帮助,如果可以,它将如何工作?

Pol*_*ial 3

您可以通过构建和注册自定义显示元数据提供程序来实现此目的。有些库会对属性名称执行更复杂的“人性化”,但是您可以使用一些可靠的正则表达式来实现一些非常有用的东西。

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)