从驼峰大小写字段名自动生成数据注释

本文关键字:自动生成 数据 注释 写字段 小写字 | 更新日期: 2023-09-27 17:50:07

我正在做一个有大量数据表的项目,并通过ASP.net MVC屏幕显示它们。

我发现自己写了很多简单的数据注释,像这样:

 [Display(Name = "Manager Name")]
 public string ManagerName { get; set; }
 [Display(Name = "Employee Name")]
 public string EmployeeName { get; set; }
 [Display(Name = "Employee No")]
 public string EmployeeNo { get; set; }
 [Display(Name = "Manager Employee No")]
 public string ManagerEmployeeNo { get; set; }

这是相当乏味的,我想知道是否有一种方法,我可以添加一个新的属性,说"convertFromCamel"(或其他东西)或有一种方法来覆盖

 @Html.DisplayNameFor(m => Model.First().EmployeeNo)

因此,如果没有数据注释,它将从驼峰大小写转换现有字段名。

thanks in advance

从驼峰大小写字段名自动生成数据注释

结合在这里的博客上找到的信息,以及这里优秀的骆驼大小写分割正则表达式,我能够解决这个问题。其概念是创建默认DataAnnotationsModelMetadataProvider的自定义风格。在属性还没有显示名的情况下,这个自定义提供程序会为您创建一个显示名(带有空格)。

首先创建一个类:

using System;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Web.Mvc;
namespace MyProject.Whatever
{
    public class CustomDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider
    {
        protected override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, PropertyDescriptor propertyDescriptor)
        {
            ModelMetadata metadata = base.GetMetadataForProperty(modelAccessor, containerType, propertyDescriptor);
            if (metadata.DisplayName == null)
            {
                metadata.DisplayName = SplitCamelCase(metadata.GetDisplayName());
            }
            return metadata;
        }
        private string SplitCamelCase(string str)
        {
            return Regex.Replace(
                Regex.Replace(
                    str,
                    @"('P{Ll})('P{Ll}'p{Ll})",
                    "$1 $2"
                ),
                @"('p{Ll})('P{Ll})",
                "$1 $2"
            );
        }
    }
}

现在通过以下操作覆盖Global.asax.cs文件中的默认DataAnnotationsModelMetadataProvider:

protected void Application_Start()
{
    //Other stuff.
    ...
    ModelMetadataProviders.Current = new CustomDataAnnotationsModelMetadataProvider();
}