Как я могу переопределить @Html.Шаблон LabelFor?
у меня есть простая форма поля
<div class="field fade-label">
@Html.LabelFor(model => model.Register.UserName)
@Html.TextBoxFor(model => model.Register.UserName)
</div>
а это:
<div class="field fade-label">
<label for="Register_UserName">Username (used to identify all services, from 4 to 30 chars)</label>
<input type="text" value="" name="Register.UserName" id="Register_UserName">
</div>
но я хочу, что LabelFor
добавить код <span>
внутри, так что я могу в конечном итоге иметь:
<label for="Register_UserName">
<span>Username (used to identify all services, from 4 to 30 chars)</span>
</label>
как я могу это сделать?
все примеры использовать EditorTemplates
но это LabelFor
.
3 ответа:
вы бы сделали это, создав свой собственный помощник HTML.
http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs
вы можете просмотреть код LabelFor, загрузив исходный код для ASP.Net MVC и изменить это как пользовательский помощник.
ответ добавил balexandre
public static class LabelExtensions { public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes) { return LabelFor(html, expression, new RouteValueDictionary(htmlAttributes)); } public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes) { ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); string htmlFieldName = ExpressionHelper.GetExpressionText(expression); string labelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); if (String.IsNullOrEmpty(labelText)) { return MvcHtmlString.Empty; } TagBuilder tag = new TagBuilder("label"); tag.MergeAttributes(htmlAttributes); tag.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName)); TagBuilder span = new TagBuilder("span"); span.SetInnerText(labelText); // assign <span> to <label> inner html tag.InnerHtml = span.ToString(TagRenderMode.Normal); return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal)); } }
LabelFor является методом расширения (статическим) и поэтому не может быть переопределен. Вам нужно будет создать свой собственный метод расширения HTML Helper для достижения того, что вам требуется.
я расширил ответ balealexandre и добавил возможность указать HTML для включения как до, так и после текста метки. Я добавил кучу перегрузок метода и комментариев. Я надеюсь, что это поможет людям!
также зацепил информацию отсюда:Html внутри метки с помощью HTML helper
namespace System.Web.Mvc.Html { public static class LabelExtensions { /// <summary>Creates a Label with custom Html before the label text. Only starting Html is provided.</summary> /// <param name="startHtml">Html to preempt the label text.</param> /// <returns>MVC Html for the Label</returns> public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, Func<object, HelperResult> startHtml) { return LabelFor(html, expression, startHtml, null, new RouteValueDictionary("new {}")); } /// <summary>Creates a Label with custom Html before the label text. Starting Html and a single Html attribute is provided.</summary> /// <param name="startHtml">Html to preempt the label text.</param> /// <param name="htmlAttributes">A single Html attribute to include.</param> /// <returns>MVC Html for the Label</returns> public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, Func<object, HelperResult> startHtml, object htmlAttributes) { return LabelFor(html, expression, startHtml, null, new RouteValueDictionary(htmlAttributes)); } /// <summary>Creates a Label with custom Html before the label text. Starting Html and a collection of Html attributes are provided.</summary> /// <param name="startHtml">Html to preempt the label text.</param> /// <param name="htmlAttributes">A collection of Html attributes to include.</param> /// <returns>MVC Html for the Label</returns> public static MvcHtmlString LabelFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, Func<object, HelperResult> startHtml, IDictionary<string, object> htmlAttributes) { return LabelFor(html, expression, startHtml, null, htmlAttributes); } /// <summary>Creates a Label with custom Html before and after the label text. Starting Html and ending Html are provided.</summary> /// <param name="startHtml">Html to preempt the label text.</param> /// <param name="endHtml">Html to follow the label text.</param> /// <returns>MVC Html for the Label</returns> public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, Func<object, HelperResult> startHtml, Func<object, HelperResult> endHtml) { return LabelFor(html, expression, startHtml, endHtml, new RouteValueDictionary("new {}")); } /// <summary>Creates a Label with custom Html before and after the label text. Starting Html, ending Html, and a single Html attribute are provided.</summary> /// <param name="startHtml">Html to preempt the label text.</param> /// <param name="endHtml">Html to follow the label text.</param> /// <param name="htmlAttributes">A single Html attribute to include.</param> /// <returns>MVC Html for the Label</returns> public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, Func<object, HelperResult> startHtml, Func<object, HelperResult> endHtml, object htmlAttributes) { return LabelFor(html, expression, startHtml, endHtml, new RouteValueDictionary(htmlAttributes)); } /// <summary>Creates a Label with custom Html before and after the label text. Starting Html, ending Html, and a collection of Html attributes are provided.</summary> /// <param name="startHtml">Html to preempt the label text.</param> /// <param name="endHtml">Html to follow the label text.</param> /// <param name="htmlAttributes">A collection of Html attributes to include.</param> /// <returns>MVC Html for the Label</returns> public static MvcHtmlString LabelFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, Func<object, HelperResult> startHtml, Func<object, HelperResult> endHtml, IDictionary<string, object> htmlAttributes) { ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); string htmlFieldName = ExpressionHelper.GetExpressionText(expression); //Use the DisplayName or PropertyName for the metadata if available. Otherwise default to the htmlFieldName provided by the user. string labelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); if (String.IsNullOrEmpty(labelText)) { return MvcHtmlString.Empty; } //Create the new label. TagBuilder tag = new TagBuilder("label"); //Add the specified Html attributes tag.MergeAttributes(htmlAttributes); //Specify what property the label is tied to. tag.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName)); //Run through the various iterations of null starting or ending Html text. if (startHtml == null && endHtml == null) tag.InnerHtml = labelText; else if (startHtml != null && endHtml == null) tag.InnerHtml = string.Format("{0}{1}", startHtml(null).ToHtmlString(), labelText); else if (startHtml == null && endHtml != null) tag.InnerHtml = string.Format("{0}{1}", labelText, endHtml(null).ToHtmlString()); else tag.InnerHtml = string.Format("{0}{1}{2}", startHtml(null).ToHtmlString(), labelText, endHtml(null).ToHtmlString()); return MvcHtmlString.Create(tag.ToString()); } } }