Extract Display Name And Description Attribute From Within A Html Helper
Solution 1:
Disclaimer: The following works only with ASP.NET MVC 3 (see the update at the bottom if you are using previous versions)
Assuming the following model:
publicclassMyViewModel
{
[Display(Description = "some description", Name = "some name")]
publicstring SomeProperty { get; set; }
}
And the following view:
<%= Html.LabelFor(x => x.SomeProperty, true) %>
Inside your custom helper you could fetch this information from the metadata:
publicstaticMvcHtmlStringLabelFor<TModel, TValue>(
this HtmlHelper<TModel> self,
Expression<Func<TModel, TValue>> 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...
}
Remark: Having [DisplayName("foo")]
and [Display(Name = "bar")]
on the same model property is redundant and the name used in the [Display]
attribute has precedence in metadata.DisplayName
.
UPDATE:
My previous answer won't work with ASP.NET MVC 2.0. There are a couples of properties that it is not possible to fill by default with DataAnnotations
in .NET 3.5, and Description
is one of them. To achieve this in ASP.NET MVC 2.0 you could use a custom model metadata provider:
publicclassDisplayMetaDataProvider : DataAnnotationsModelMetadataProvider
{
protectedoverride ModelMetadata CreateMetadata(
IEnumerable<Attribute> attributes,
Type containerType,
Func<object> modelAccessor,
Type modelType,
string propertyName
)
{
var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault();
if (displayAttribute != null)
{
metadata.Description = displayAttribute.Description;
metadata.DisplayName = displayAttribute.Name;
}
return metadata;
}
}
which you would register in Application_Start
:
protectedvoidApplication_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
ModelMetadataProviders.Current = new DisplayMetaDataProvider();
}
and then the helper should work as expected:
publicstaticMvcHtmlStringLabelFor<TModel, TValue>(
this HtmlHelper<TModel> self,
Expression<Func<TModel, TValue>> 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...
}
Post a Comment for "Extract Display Name And Description Attribute From Within A Html Helper"