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

#asp.net-mvc #asp.net-mvc-3

#asp.net-mvc #asp.net-mvc-3

Вопрос:

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

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

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

Ответ №1:

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

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

Ответ №2:

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

Комментарии:

1. Спасибо. Просто хотел получить подтверждение, что в MVC3 не было ничего нового. Интересно, почему они не предоставили Html.LabelFor немного больше гибкости. Думаю, я не единственный, кто хочет это сделать.

2. @LeeGarner ну, я в команде MVC, и я не уверен, почему помощник Label не принимает htmlAttributes параметр. Возможно, какой-то недосмотр. Я сообщу об ошибке, чтобы убедиться, что мы добавим ее в следующей версии.

3. @marcind пока вы этим занимаетесь, не могли бы вы отключить внутренние помощники, т.Е. в LabelExtensions LabelHelper является внутренним, поэтому мы не можем использовать его при развертывании наших собственных вспомогательных расширений.

4. @George R — следующая версия MVC будет поддерживать htmlAttributes параметр, как и все другие вспомогательные средства, для включения этого сценария. Мы, вероятно, не будем делать LabelHelper функцию общедоступной. Но я надеюсь, что это удовлетворит ваши потребности.

5. Просто ради того, чтобы кто-нибудь читал это сейчас, MVC4 допускает параметр htmlAttributes, который решает эту проблему.