C# 根据驼峰大小写字段名自动生成数据批注
我正在处理一个项目,其中包含大量数据表,并通过ASP.net MVC屏幕显示它们 我发现自己写了很多简单的数据注释,如下所示: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")]
[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();
}