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

Ric*_*ard 5 asp.net-mvc

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

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

new {disabled="disabled", @class="pcTextBoxWithoutPaddingDisabled"})%> 
Run Code Online (Sandbox Code Playgroud)

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

<label class="pcLabelBlackWithoutPadding">
Run Code Online (Sandbox Code Playgroud)

我希望能够保持我的Html元素的创建方式.

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

谢谢你的帮助.

小智 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));

}
Run Code Online (Sandbox Code Playgroud)


Hei*_*nge 3

我用 lambda 表达式稍微修改了 Alexandr 代码,以防有人需要 lambda 表达式。

用法:

@Html.LabelFor(model => model.Property , new { @class = "bigFont" })
Run Code Online (Sandbox Code Playgroud)

代码:

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));
    }
Run Code Online (Sandbox Code Playgroud)