从驼峰式字段名称自动生成数据注释

Automatically generating data annotations from camel case field names

我正在处理一个包含大量数据表并通过 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)

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

提前致谢

结合使用在博客 here, and the excellent camel-case split regex here 上找到的信息,我能够解决这个问题。这个概念是您创建默认 DataAnnotationsModelMetadataProvider 的自定义风格。在 属性 还没有显示名称的情况下,此自定义提供程序会启动并为您创建一个(带空格)。

首先,创建一个class:

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})",
                    " "
                ),
                @"(\p{Ll})(\P{Ll})",
                " "
            );
        }
    }
}

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

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