免责声明:以下内容仅适用于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<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
...
}
备注:在模型属性上同时使用[DisplayName("foo")]
和[Display(Name = "bar")]
是冗余的,并且在metadata.DisplayName
中使用的名称将优先于[Display]
属性中使用的名称。
更新:
我的先前答案在ASP.NET MVC 2.0中无法使用。在.NET 3.5中,默认情况下无法使用DataAnnotations
填充一些属性,Description
就是其中之一。为了在ASP.NET MVC 2.0中实现此操作,可以使用自定义模型元数据提供程序:
public class DisplayMetaDataProvider : DataAnnotationsModelMetadataProvider
{
protected override 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;
}
}
您需要在Application_Start
中注册它:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
ModelMetadataProviders.Current = new DisplayMetaDataProvider();
}
然后助手应该按预期工作:
public static MvcHtmlString LabelFor<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
...
}
DataAnnotations
默认填充,其中Description就是其中之一。在.NET 4.0中应该可以工作。 - Darin Dimitrov