2011-04-18 48 views

回答

19

看起來像一個自定義的助手良好的情景:

public static class LabelExtensions 
{ 
    public static MvcHtmlString LabelFor<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> ex, 
     Func<object, HelperResult> template 
    ) 
    { 
     var htmlFieldName = ExpressionHelper.GetExpressionText(ex); 
     var for = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName); 
     var label = new TagBuilder("label"); 
     label.Attributes["for"] = TagBuilder.CreateSanitizedId(for); 
     label.InnerHtml = template(null).ToHtmlString(); 
     return MvcHtmlString.Create(label.ToString()); 
    } 
} 

然後:

@Html.LabelFor(
    x => x.Name, 
    @<span>Hello World</span> 
) 

UPDATE:

要達到什麼樣的,你在評論部分問你可能會嘗試以下操作:

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString LabelFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> ex, Func<object, HelperResult> template) 
    { 
     var htmlFieldName = ExpressionHelper.GetExpressionText(ex); 
     var propertyName = htmlFieldName.Split('.').Last(); 
     var label = new TagBuilder("label"); 
     label.Attributes["for"] = TagBuilder.CreateSanitizedId(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)); 
     label.InnerHtml = string.Format(
      "{0} {1}", 
      propertyName, 
      template(null).ToHtmlString() 
     ); 
     return MvcHtmlString.Create(label.ToString()); 
    } 
} 

然後:

@Html.LabelFor(
    x => x.Name, 
    @<em>mandatory</em> 
) 
+1

@達林 - 季米特洛夫阿爽,我怎樣才能得到它寫的名稱屬性?我想要的結果是 Marcus 2011-04-18 19:25:25

+0

@馬庫斯,請參閱我的更新。 – 2011-04-18 19:31:50

+0

@ darin-dimitrov,非常感謝您的幫助,但我認爲我有點不清楚。我稱爲PropertyName的標籤值應該是我的屬性上的display屬性中指定的值,或者與正常標籤相同的名稱。再次感謝您的幫助 – Marcus 2011-04-18 19:53:58

2

你將不得不編寫自己的幫手。內置的Html.Label幫助程序會自動HTML編碼labelText參數。

2

我借在Darin的答案,並添加到它。我在標籤文本和標籤文本之後添加了標籤文本和html之前的Html功能。我還添加了一堆重載方法和評論。

我也得到了這個職位的一些信息:How can I override the @Html.LabelFor template?

如果希望幫助鄉親。

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()); 
     } 
    } 
} 
+0

我如何使用它? – Terkhos 2015-05-26 14:56:52

+0

我只是將上面的文本放入一個名爲LabelFor.cs的文件中,我將其放入「Helpers」目錄中。 它用於我的任何Razor .cshtml使用@ Html.LabelFor()方法。 – Setarcos 2015-07-31 19:25:29

1

爲了滿足SOC與固體原理,代碼可以被增強以下面的代碼:

@Html.LabelFor(m => m.Phone,true) 

到:

public static MvcHtmlString LabelFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> ex,bool applyStylingHtml) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData); 
     string displayName = metadata.DisplayName; 
     string description= metadata.Description; 
     if (String.IsNullOrEmpty(displayName)) 
     { 
      return MvcHtmlString.Empty; 
     } 

     var sb = new StringBuilder(); 
     sb.Append(displayName); 


     var htmlFieldName = ExpressionHelper.GetExpressionText(ex); 
     var propertyName = htmlFieldName.Split('.').Last(); 

     var tag = new TagBuilder("label"); 
     tag.Attributes["for"] = TagBuilder.CreateSanitizedId(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)); 
     tag.SetInnerText(sb.ToString()); 

     //Func<object, HelperResult> template='<em>'; 
     HtmlString nestedHtml=new HtmlString("<em>"+description+"</em>"); 
     tag.InnerHtml = string.Format(
      "{0} {1}", 
      tag.InnerHtml, 
      nestedHtml 
     ); 

     return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal)); 
    } 

然後在剃刀代碼中使用它使一切更加動態化,描述屬性應該應用在Model類上,然後HtmlHelper將抓取描述作爲應用「em」的文本Html標籤:

[Display(Name ="Phone",Description = "should be included extention")] 
public string Phone { get; set; } 

剛擡起頭,你需要通過添加導入自定義的HtmlHelper命名空間的觀點:

@using yourNamespace