从HTML帮助程序中提取显示名称和描述属性

我正在构建一个自定义HTML.LabelFor帮助器,如下所示:

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

为了能够获得属性的正确名称,我使用以下代码:

 metadata.DisplayName 

在ModelView类的属性上,我得到了:

 [DisplayName("Titel")] 

问题是我还需要一个描述。 有一个名为Display的属性,它有名称和描述,但我没有看到如何使用上面代码中的元数据变量提取它?

免责声明:以下内容仅适用于ASP.NET MVC 3(如果您使用的是以前的版本,请参阅底部的更新)

假设以下型号:

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

以下观点:

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

在您的自定义帮助程序中,您可以从元数据中获取此信息:

 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 ... } 

备注:在同一模型属性上具有[DisplayName("foo")][Display(Name = "bar")]是多余的, [Display]属性中使用的名称在metadata.DisplayName具有优先权。


更新:

我之前的回答不适用于ASP.NET MVC 2.0。 默认情况下,.NET 3.5中的DataAnnotations无法填充一对属性,而Description是其中之一。 要在ASP.NET MVC 2.0中实现此目的,您可以使用自定义模型元数据提供程序:

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

您将在Application_Start注册:

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

然后帮助器应该按预期工作:

 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 ... }