Extraer Nombre y descripción de pantalla Atributo desde un ayudante de HTML

Estoy creando un ayudante HTML.LabelFor personalizado que se ve así:

 public static MvcHtmlString LabelFor(this HtmlHelper self, Expression<Func> expression, Boolean showToolTip) { var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData); ... } 

Para poder obtener el nombre correcto para la propiedad, estoy usando el siguiente código:

 metadata.DisplayName 

Y en la propiedad de la clase ModelView obtuve:

 [DisplayName("Titel")] 

El problema es que también necesito una descripción. ¿Hay un atributo llamado Pantalla y que tiene Nombre y Descripción pero no veo cómo extraer esto con la variable de metadatos en el código anterior?

Descargo de responsabilidad: lo siguiente solo funciona con ASP.NET MVC 3 (consulte la actualización en la parte inferior si está utilizando versiones anteriores)

Suponiendo el siguiente modelo:

 public class MyViewModel { [Display(Description = "some description", Name = "some name")] public string SomeProperty { get; set; } } 

Y la siguiente vista:

 < %= Html.LabelFor(x => x.SomeProperty, true) %> 

Dentro de su ayudante personalizado, puede obtener esta información de los metadatos:

 public static MvcHtmlString LabelFor( this HtmlHelper self, Expression> expression, bool showToolTip ) { var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData); var description = metadata.Description; // will equal "some description" var name = metadata.DisplayName; // will equal "some name" // TODO: do something with the name and the description ... } 

Nota: Tener [DisplayName("foo")] y [Display(Name = "bar")] en la misma propiedad del modelo es redundante y el nombre usado en el atributo [Display] tiene prioridad en metadata.DisplayName .


ACTUALIZAR:

Mi respuesta anterior no funcionará con ASP.NET MVC 2.0. Hay un par de propiedades que no es posible rellenar de forma predeterminada con DataAnnotations en .NET 3.5, y la Description es una de ellas. Para lograr esto en ASP.NET MVC 2.0, puede usar un proveedor de metadatos de modelo personalizado:

 public class DisplayMetaDataProvider : DataAnnotationsModelMetadataProvider { protected override ModelMetadata CreateMetadata( IEnumerable attributes, Type containerType, Func modelAccessor, Type modelType, string propertyName ) { var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); var displayAttribute = attributes.OfType().FirstOrDefault(); if (displayAttribute != null) { metadata.Description = displayAttribute.Description; metadata.DisplayName = displayAttribute.Name; } return metadata; } } 

el cual te registrarías en Application_Start :

 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); ModelMetadataProviders.Current = new DisplayMetaDataProvider(); } 

y luego el ayudante debe trabajar como se espera:

 public static MvcHtmlString LabelFor( this HtmlHelper self, Expression> expression, bool showToolTip ) { var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData); var description = metadata.Description; // will equal "some description" var name = metadata.DisplayName; // will equal "some name" // TODO: do something with the name and the description ... }