Html.DescriptionFor <T> - PullRequest
       9

Html.DescriptionFor <T>

3 голосов
/ 23 мая 2010

Я пытаюсь эмулировать Html Helper для "LabelFor" для работы с атрибутом [Description].У меня много проблем с выяснением, как получить собственность от помощника.Это текущая подпись ...

class Something
{
 [Description("Simple Description")]
 [DisplayName("This is a Display Name, not a Description!")]
 public string Name { get; set; }
}

public static MvcHtmlString DescriptionFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression);

1 Ответ

4 голосов
/ 23 мая 2010

Это не так просто, поскольку DataAnnotationsModelMetadataProvider (что за имя!) Не использует атрибут Description. Поэтому, чтобы использовать атрибут Description, вам нужно сделать следующее:

  1. Создать кастом ModelMetaDataProvider.
  2. Зарегистрируйте его в качестве поставщика метаданных приложения.
  3. Реализация метода 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
        }
    }
}

Это должно работать, я проверил это на своей машине.

Шей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...