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

时间:2015-03-05 12:29:27

标签: c# asp.net-mvc razor ef-code-first data-annotations

我想访问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}}?

结果应该是这样的,

主页

  1. 家庭电话
  2. 家庭住址
  3. 办公室

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

2 个答案:

答案 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");