2015-03-05 2 views
0

Я хочу получить DataAnnotationDisplayName и аналогичный GroupName модельного класса, а затем прокрутить в режиме MVC. Для примера позвольте мне сказать, один из моих свойств модели, как этотКак прокрутить DisplayName DataAnnotation в представлении 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; } 
} 

Как петля через DisplayName где подобный GroupName?

Результат должен как это,

Главная

  1. Домашний телефон
  2. Главная Адрес

Офис

  1. Телефон офиса
  2. Адрес офиса
+3

Вы делаете жизнь трудно для себя. Почему бы вам просто не группировать их в отдельные объекты, такие как 'OfficeModel' и' HomeModel'? Гораздо чище. – mattytommo

+0

@mattytommo я поддерживаю то, что вы сказали, он может просто сделать это двумя объектами для лучшей читаемости и ремонтопригодности. –

+0

Здесь моя цель использования различна, я хочу добиться чего-то вроде раскрывающегося списка, чтобы предоставить пользователю возможность выбора имени столбца. – sridharnetha

ответ

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 и отобразить этот словарь (или другую модель) в вашем представлении чаду использования хелпера в бритве.

+0

Существует уже помощник, который делает только что: '@Html. DisplayNameFor() ' –

+0

@Silvex Я попытался с вашим фрагментом кода, но он просто возвращает' DisplayName' независимо от 'GroupName'. В моем случае 'DisplayName' должен содержать списки, в которых' GroupName = Office'. как я могу проверить это условие? – sridharnetha

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"); 
Смежные вопросы