Это не так просто, поскольку DataAnnotationsModelMetadataProvider
(что за имя!) Не использует атрибут Description.
Поэтому, чтобы использовать атрибут Description, вам нужно сделать следующее:
- Создать кастом
ModelMetaDataProvider
.
- Зарегистрируйте его в качестве поставщика метаданных приложения.
- Реализация метода
DescriptionFor
.
Итак ...
Вот кастом ModelMetaDataProvider
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel;
namespace MvcApplication2
{
public class DescriptionModelMetaDataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
ModelMetadata result = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
DescriptionAttribute descriptionAttribute = attributes.OfType<DescriptionAttribute>().FirstOrDefault();
if (descriptionAttribute != null)
result.Description = descriptionAttribute.Description;
return result;
}
}
}
Теперь регистрация выполняется в файле Global.asax в методе Application_Start следующим образом:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
// This is the important line:
ModelMetadataProviders.Current = new DescriptionModelMetaDataProvider();
}
И, наконец, реализация метода DescriptionFor
:
using System.Linq.Expressions;
namespace System.Web.Mvc.Html
{
public static class Helper
{
public static MvcHtmlString DescriptionFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
string fieldName = ExpressionHelper.GetExpressionText(expression);
return MvcHtmlString.Create(String.Format("<label for=\"{0}\">{1}</label>",
html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(fieldName),
metadata.Description));// Here goes the description
}
}
}
Это должно работать, я проверил это на своей машине.
Шей.