2012-07-02 5 views
5

Как мы можем использовать System.ComponentModel.DataAnnotations.DisplayAttribute, чтобы установить метку для свойства, я хочу использовать его для класса, но он не разрешен для классов.Использование DisplayAttribute в классе

using System.ComponentModel.DataAnnotations; 

[Display(Name = "A person")] 
public class Person 
{ 
    [Display(Name = "A name")] 
    public string Name { get; set; } 
} 

Кто-нибудь знает обходное решение для этого?

EDIT: Я хочу использовать его на строго типизированном виде. Когда я создаю новую сильно типизированный, имя класса закодировано в HTML, так:

@model Models.Person 
<fieldset> 
    <legend>Person</legend> 
    <div class="display-label"> 
     @Html.LabelFor(model => model.Name) 
    </div> 
</fieldset> 

Я хочу сделать что-то похожее на Name собственности.

+8

Почему вы хотите это сделать ?. – Jorge

+1

Вы можете создать свой собственный атрибут, который сделает это. – MBen

ответ

6

Атрибут DisplayName (от System.ComponentModel) выполняет аналогичную функцию и может применяться к классу.

MSDN

+0

Спасибо, Фил, этот ответ на мой первый вопрос. Вы знаете простой способ получить значение в представлении (я отредактировал свое первое сообщение)? Я знаю, что могу использовать рефлексию, но есть ли более простой способ, например, HtmlHelper? –

+0

@DudePascalou К сожалению, нет. Я просто немного поиграл с 'Html.LabelFor' с вариациями' (model => model) ', но не получил нигде :-( – PhilPursglove

1

Я действительно не знаю, если это еще один способ сделать это, но я обычно не hard code этого я использую создать переменную в представлении, а затем я назвал, где я нужен. В вашем случае, чтобы сделать его немного более элегантно я буду делать

@{ 
    var viewName = typeof(Foo).Name; 
} 

@model Models.Person 
<fieldset> 
<legend>@viewName</legend> 
<div class="display-label"> 
    @Html.LabelFor(model => model.Name) 
</div> 
</fieldset> 
+0

Спасибо за ответ. Я получу значение DisplayNameAttribute с помощью рефлексии в крайнем случае , если нет более простого способа. –

1

Используя декоратор, просто обернуть DisplayAttribute с собственным обычаем атрибутов специально для классов.

using System; 
using System.ComponentModel.DataAnnotations; 

namespace YourNameSpaceHere.Support 
{ 
    [AttributeUsage(AttributeTargets.Class)] 
    public class DisplayForClassAttribute : Attribute 
    { 
     protected readonly DisplayAttribute Attribute; 

     public DisplayForClassAttribute() 
     { 
      this.Attribute = new DisplayAttribute(); 
     } 

     public string ShortName 
     { 
      get { return this.Attribute.ShortName; } 
      set { this.Attribute.ShortName = value; } 
     } 

     public string Name 
     { 
      get { return this.Attribute.Name; } 
      set { this.Attribute.Name = value; } 
     } 

     public string Description 
     { 
      get { return this.Attribute.Description; } 
      set { this.Attribute.Description = value; } 
     } 

     public string Prompt 
     { 
      get { return this.Attribute.Prompt; } 
      set { this.Attribute.Prompt = value; } 
     } 

     public string GroupName 
     { 
      get { return this.Attribute.GroupName; } 
      set { this.Attribute.GroupName = value; } 
     } 

     public Type ResourceType 
     { 
      get { return this.Attribute.ResourceType; } 
      set { this.Attribute.ResourceType = value; } 
     } 

     public bool AutoGenerateField 
     { 
      get { return this.Attribute.AutoGenerateField; } 
      set { this.Attribute.AutoGenerateField = value; } 
     } 

     public bool AutoGenerateFilter 
     { 
      get { return this.Attribute.AutoGenerateFilter; } 
      set { this.Attribute.AutoGenerateFilter = value; } 
     } 

     public int Order 
     { 
      get { return this.Attribute.Order; } 
      set { this.Attribute.Order = value; } 
     } 

     public string GetShortName() 
     { 
      return this.Attribute.GetShortName(); 
     } 

     public string GetName() 
     { 
      return this.Attribute.GetName(); 
     } 

     public string GetDescription() 
     { 
      return this.Attribute.GetDescription(); 
     } 

     public string GetPrompt() 
     { 
      return this.Attribute.GetPrompt(); 
     } 

     public string GetGroupName() 
     { 
      return this.Attribute.GetGroupName(); 
     } 

     public bool? GetAutoGenerateField() 
     { 
      return this.Attribute.GetAutoGenerateField(); 
     } 

     public bool? GetAutoGenerateFilter() 
     { 
      return this.Attribute.GetAutoGenerateFilter(); 
     } 

     public int? GetOrder() 
     { 
      return this.Attribute.GetOrder(); 
     } 
    } 
} 

Использование будет выглядеть следующим образом:

[DisplayForClass(Name = "Approval Matrix")] 
public class ApprovalMatrixViewModel 
{ 
} 
+0

Tks @Blake, я думаю, что это сделало бы трюк. Можете ли вы показать нам, как это будет выглядеть в представлении? Будет ли '@ Html.LabelFor' достаточно? –

Смежные вопросы