2011-04-18 47 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