#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, который решает эту проблему.