Могу ли я добавить определение класса CSS в Html.LabelFor в MVC3?

Я надеюсь, что у кого-то есть какие-то идеи. Я хотел бы привести в порядок свой код, поэтому я уже использовал Html.LabelFor. Однако теперь я хочу назначить класс CSS для меток.

Html.LabelFor(model => model.Customer.Description   ????)

Кто-нибудь знает, возможно ли это в MVC3. Обратите внимание, что я использую MVC3. Я уже видел сообщение, в котором говорилось о MVC2 и о том, что простого решения не существует.


person JudyJ    schedule 07.05.2011    source источник


Ответы (2)


В MVC 3 нет встроенного способа сделать это. Вам придется написать свой помощник, который это сделает. Взгляните на класс LabelExtensions, чтобы увидеть, как это делается.

person marcind    schedule 07.05.2011
comment
Спасибо. Просто хотел получить подтверждение, что в MVC3 нет ничего нового. Интересно, почему они не дали Html.LabelFor немного больше гибкости. Думаю, я не единственный, кто хочет это сделать. - person JudyJ; 07.05.2011
comment
@LeeGarner хорошо, я в команде MVC, и я не уверен, почему помощник Label не принимает параметр htmlAttributes. Возможно, какая-то оплошность. Я зарегистрирую ошибку, чтобы убедиться, что мы добавим ее в следующую версию. - person marcind; 07.05.2011
comment
@marcind, пока вы этим занимаетесь, можете ли вы отменить внутренние помощники, т.е. в LabelExtensions LabelHelper является внутренним, поэтому мы не можем использовать его при развертывании наших собственных вспомогательных расширений. - person George R; 17.07.2011
comment
@George R - маловероятно, что они это сделают. Они интернируют их по какой-то причине, и это для того, чтобы люди не делали то, что вы хотите делать. Это позволяет им изменять реализацию от версии к версии, не беспокоясь о совместимости с приложениями конечного пользователя. - person Erik Funkenbusch; 17.07.2011
comment
@George R - следующая версия MVC будет поддерживать параметр htmlAttributes, как и все другие помощники, для включения этого сценария. Однако мы, вероятно, не будем делать функцию LabelHelper общедоступной. Но я надеюсь, что это удовлетворит ваши потребности. - person marcind; 18.07.2011
comment
Просто для тех, кто читает это сейчас, MVC4 разрешает параметр htmlAttributes, который решает эту проблему. - person Rich; 23.08.2013

Вот, приятель-о:

namespace System.Web.Mvc.Html
{
  using System;
  using Collections.Generic;
  using Linq;
  using Linq.Expressions;
  using Mvc;

  public static class LabelExtensions
  {
    public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
    {
      return html.LabelFor(expression, null, htmlAttributes);
    }

    public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string labelText, object htmlAttributes)
    {
      return html.LabelHelper(
            ModelMetadata.FromLambdaExpression(expression, html.ViewData),
            ExpressionHelper.GetExpressionText(expression),
            HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes),
            labelText);
    }

    private static MvcHtmlString LabelHelper(this HtmlHelper html, ModelMetadata metadata, string htmlFieldName, IDictionary<string, object> htmlAttributes, string labelText = null)
    {
      var str = labelText
            ?? (metadata.DisplayName
            ?? (metadata.PropertyName
            ?? htmlFieldName.Split(new[] { '.' }).Last()));

      if (string.IsNullOrEmpty(str))
        return MvcHtmlString.Empty;

      var tagBuilder = new TagBuilder("label");
      tagBuilder.MergeAttributes(htmlAttributes);
      tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
      tagBuilder.SetInnerText(str);

      return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal);
    }

    private static MvcHtmlString ToMvcHtmlString(this TagBuilder tagBuilder, TagRenderMode renderMode)
    {
      return new MvcHtmlString(tagBuilder.ToString(renderMode));
    }
  }
}
person George R    schedule 17.07.2011