C# 根据驼峰大小写字段名自动生成数据批注

C# 根据驼峰大小写字段名自动生成数据批注,c#,asp.net-mvc,data-annotations,C#,Asp.net Mvc,Data Annotations,我正在处理一个项目,其中包含大量数据表,并通过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")]

我正在处理一个项目,其中包含大量数据表,并通过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)
因此,如果没有数据注释,它将从大小写转换现有字段名


提前感谢

结合博客上的信息和优秀的camel-case-split正则表达式,我能够解决这个问题。其概念是创建默认的
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"
            );
        }
    }
}

它不是您需要的数据批注,而是一个自定义DataAnnotationsModelMetadataProvider,您可以在其中覆盖
CreateMetadata()
以设置ModelMetatdata.DisplayName属性Tanks Jamie。我将在第二天左右试一试。cheers@Chris-没问题,希望对你有用。让我知道你的进展情况。谢谢,但我无法将类型“CustomDataAnnotationsModelMetadataProvider”隐式转换为“System.Web.Mvc.ModelMetadataProvider”@Chris你使用的是哪个版本的Mvc/.net?我似乎无法复制我这边的问题。因此,我终于有时间来研究这个问题,问题是某种损坏的引用,这意味着它无法识别System.Web.ModelBinding.Mvc,而是选择System.Web.ModelBinding.ModelMetadataProviders。现在一切都很好-谢谢:)
protected void Application_Start()
{
    //Other stuff.
    ...
    ModelMetadataProviders.Current = new CustomDataAnnotationsModelMetadataProvider();
}