如何在MVC视图中循环访问DataAnnotation的DisplayName?
我想访问DataAnnotation
的DisplayName
和模型类的类似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; } }
如何循环显示类似GroupName
的DisplayName
?
结果应该是这样的,
家
- 家庭电话
- 家庭地址
办公室
- 办公室电话
- 办公地址
您可以使用函数创建一个帮助器类,该函数使用表达式来读取属性的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");