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

Lob*_*nts 9 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")]
 public string EmployeeNo { get; set; }

 [Display(Name = "Manager Employee No")]
 public string ManagerEmployeeNo { get; set; }
Run Code Online (Sandbox Code Playgroud)

这变得非常繁琐,并且想知道是否有一种方法可以添加一个新的属性,说"convertFromCamel"(或其他东西)或者是否有办法覆盖

 @Html.DisplayNameFor(m => Model.First().EmployeeNo)
Run Code Online (Sandbox Code Playgroud)

因此,如果没有数据注释,它会从camel case转换现有的字段名称.

提前致谢

Jam*_*tan 10

使用的博客上找到的信息结合在这里,和优秀的驼峰分裂正则表达式在这里,我能来解决这一问题.这个概念是您创建默认的自定义风格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"
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在覆盖默认DataAnnotationsModelMetadataProvider在您Global.asax.cs通过执行以下文件:

protected void Application_Start()
{
    //Other stuff.
    ...
    ModelMetadataProviders.Current = new CustomDataAnnotationsModelMetadataProvider();
}
Run Code Online (Sandbox Code Playgroud)