2010-09-06 80 views
5

如何爲接受屬性的Html.Label創建一個ASP.Net MVC Helper?帶屬性列表的ASP.Net MVC Html.Label?

當前,當我定義一個Html.TextBox時,我可以傳遞屬性列表。類似如下:

new {disabled="disabled", @class="pcTextBoxWithoutPaddingDisabled"})%> 

但是,它看起來並不像Html.Label具有此功能。因此,我必須使用標籤標籤來定義我的標籤。類似如下:

<label class="pcLabelBlackWithoutPadding"> 

我想成爲一致我如何創建我的Html元素。

那麼,我該如何創建一個Html.Label,它將包含屬性列表?

感謝您的幫助。

回答

2

我建議創建您自己的HtmlHelper擴展方法並使用TagBuilder創建標籤。

public static HtmlHelperExtensions 
{ 
     public static Label(this HtmlHelper helper, string labelText, object properties) 
     { 
      var builder = new TagBuilder("label"); 
      builder.MergeAttributes(new RouteValueDictionary(properties)); 
      builder.SetInnerText(labelText); 
      return builder.ToString(TagRenderMode.Normal); 
     } 
} 

請參閱有關如何創建一個強類型的標籤幫手的想法MVC source code。請注意,您需要將包含擴展名的命名空間添加到頁面或web.config中才能使用它。

9

這是爲了MVC3更新版本:

public static MvcHtmlString Label(this HtmlHelper helper, String htmlFieldName, String labelText, Object htmlAttributes) 
{ 
    ModelMetadata metadata = ModelMetadata.FromStringExpression(htmlFieldName, helper.ViewData); 

    String innerText = labelText ?? (metadata.DisplayName ?? (metadata.PropertyName ?? htmlFieldName.Split('.').Last())); 

    if (String.IsNullOrEmpty(innerText)) 
    { 
     return MvcHtmlString.Empty; 
    } 

    TagBuilder tagBuilder = new TagBuilder("label"); 
    tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName))); 
    tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
    tagBuilder.SetInnerText(innerText); 

    return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal)); 

} 
+0

真正起作用:) – 2012-03-21 08:50:01

3

我已經修改亞歷山大碼位與lambda表達式,如果有人需要λ表達式。

用法:

@Html.LabelFor(model => model.Property , new { @class = "bigFont" }) 

代碼:

public static MvcHtmlString LabelFor<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression, Object htmlAttributes) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 

     var innerText = metadata.DisplayName ?? metadata.PropertyName; 

     if (String.IsNullOrEmpty(innerText)) 
     { 
      return MvcHtmlString.Empty; 
     } 

     var tagBuilder = new TagBuilder("label"); 
     tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(metadata.PropertyName))); 
     tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     tagBuilder.SetInnerText(innerText); 

     return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal)); 
    } 
+0

完美解決方案。 – dotTutorials 2013-03-25 21:19:36