具有属性列表的ASP.Net MVC Html.Label?

时间:2010-09-06 16:00:01

标签: asp.net-mvc

如何为Html.Label创建一个ASP.Net MVC Helper,它接受属性?

目前,当我定义一个Html.TextBox时,我可以传入一个属性列表。有点像下面这样:

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

然而,它看起来并不像Html.Label具有此功能。因此,我必须使用label标签定义我的标签。有点像下面这样:

<label class="pcLabelBlackWithoutPadding">

我想与我的Html元素如何创建保持一致。

那么,如何创建一个Html.Label,它将包含属性列表?

感谢您的帮助。

3 个答案:

答案 0 :(得分: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));

}

答案 1 :(得分:3)

我已经使用lambda表达式修改了一些Alexandr代码,以防任何人需要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));
    }

答案 2 :(得分: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才能使用它。