从驼峰式字段名称自动生成数据注释
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();
}
我正在处理一个包含大量数据表并通过 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();
}