我想访问DataAnnotation
的{{1}}和类似DisplayName
的模型类,然后在MVC视图中循环。例如,让我说我的一个模型属性是这样的
GroupName
如何循环浏览类似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; }
}
的{{1}}?
结果应该是这样的,
主页
办公室
答案 0 :(得分:0)
您可以使用函数创建一个帮助器类,该函数使用表达式来读取属性的DisplayName和GroupName属性:
public static string GetDisplayName<T, TProp>(Expression<Func<T, TProp>> expression)
{
MemberExpression body = GetMemberExpression(expression);
DisplayNameAttribute attribute = body.Member.GetCustomAttributes(typeof(DisplayNameAttribute), true).Cast<DisplayNameAttribute>().Single();
return attribute.DisplayName;
}
并在你的剃须刀中使用它:
<span>@ReflectionHelper.GetDisplayName((Person p) => p.HomePhone)</span>
为了便于阅读,我建议您使用基于Person类的帮助程序在控制器中准备字典(或其他模型),并在视图中渲染该字典(或其他模型),而不是使用剃刀中的帮助程序。
答案 1 :(得分:0)
我找到了解决方案。
public List<string> GetDisplayNamesGrouped(Type ClassName, string GroupName)
{
List<string> DisplayNameList = new List<string>();
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");