如何在MVC视图中循环访问DataAnnotation的DisplayName?

我想访问DataAnnotationDisplayName和模型类的类似GroupName ,然后在MVC视图中循环。 例如,让我说我的一个模型属性是这样的

 public class Person { [Display(Name="Home Phone",GroupName="Home")] public string HomePhone { get; set; } [Display(Name = "Home Address", GroupName = "Home")] public string HomeAddress { get; set; } [Display(Name = "Office Phone", GroupName = "Office")] public string OfficePhone { get; set; } [Display(Name = "Office Address", GroupName = "Office")] public string OfficeAddress { get; set; } } 

如何循环显示类似GroupNameDisplayName

结果应该是这样的,

  1. 家庭电话
  2. 家庭地址

办公室

  1. 办公室电话
  2. 办公地址

您可以使用函数创建一个帮助器类,该函数使用表达式来读取属性的DisplayName和GroupName属性:

  public static string GetDisplayName(Expression> expression) { MemberExpression body = GetMemberExpression(expression); DisplayNameAttribute attribute = body.Member.GetCustomAttributes(typeof(DisplayNameAttribute), true).Cast().Single(); return attribute.DisplayName; } 

并在你的razor中使用它:

 @ReflectionHelper.GetDisplayName((Person p) => p.HomePhone) 

为了便于阅读,我建议您使用基于Person类的帮助程序在控制器中准备字典(或其他模型),并在视图中渲染该字典(或其他模型),而不是使用剃刀中的帮助程序。

我找到了解决方案。

 public List GetDisplayNamesGrouped(Type ClassName, string GroupName) { List DisplayNameList = new List(); var properties = ClassName.GetProperties(); foreach (var property in properties) { var displayAttribute = property.GetCustomAttributes(typeof(DisplayAttribute), true).FirstOrDefault() as DisplayAttribute; string displayName = property.Name; if (displayAttribute != null) { if (displayAttribute.GroupName == GroupName) { displayName = displayAttribute.Name; DisplayNameList.Add(displayName); } } } return DisplayNameList; } 

用法:

 var Home = GetDisplayNamesGrouped(typeof(Person), "Home"); var Office = GetDisplayNamesGrouped(typeof(Person), "Office");