2012-07-02 14 views
5

Como podemos usar System.ComponentModel.DataAnnotations.DisplayAttribute para establecer una etiqueta para una propiedad, quiero usarla para la clase pero no está permitido en las clases.Use DisplayAttribute en la clase

using System.ComponentModel.DataAnnotations; 

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

¿Alguien conoce una solución para eso?

EDIT: Quiero usarlo en una vista fuertemente tipada. Cuando se crea un nuevo punto de vista fuertemente tipado, el nombre de clase es difícil codificado en HTML, así:

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

Quiero hacer algo similar a la propiedad Name.

+8

Por qué quieres hacer eso ?. – Jorge

+1

Puede crear su propio atributo que lo haga. – MBen

Respuesta

6

El atributo DisplayName (desde System.ComponentModel) realiza una función similar y se puede aplicar a una clase.

MSDN

+0

Gracias Phil, esta respuesta a mi primera pregunta. ¿Conoces una forma simple de recuperar el valor en la vista (edité mi primer mensaje)? Sé que puedo usar la reflexión, pero ¿hay una manera más simple como HtmlHelper, por ejemplo? –

+0

@DudePascalou Desafortunadamente no. Acabo de jugar rápido con 'Html.LabelFor' con variaciones de' (modelo => modelo) 'pero no llegué a ninguna parte :-( – PhilPursglove

1

verdad es que no sé si es que hay otra manera de hacer esto, pero por lo general no hard code ello utilizo crear una variable en la vista y luego me llamaron en el que necesitaba. En su caso para hacerlo un poco más elegante que voy a hacer

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

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

Gracias por la respuesta. Recupero el valor DisplayNameAttribute por reflexión en último recurso. , si no hay una manera más simple. –

1

Uso del patrón de decorador, simplemente envuelva el DisplayAttribute con su propio atributo personalizado específicamente para las clases.

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(); 
     } 
    } 
} 

uso sería la siguiente:

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

Tks @Blake, creo que sería el truco. ¿Puede mostrarnos cómo se vería esto en la vista? ¿Sería suficiente un '@ Html.LabelFor'? –

Cuestiones relacionadas