5

How do I create an ASP.Net MVC Helper for an Html.Label which takes in attributes?

Currently when I define an Html.TextBox I am able to pass in a list of attributes. Sort of like below:

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

However, it does not look as though the Html.Label has this feature. As a result, I have to define my labels using the label tag. Sort of like below:

<label class="pcLabelBlackWithoutPadding">

I would like to be consistent I how my Html element get created.

So, how do I create an Html.Label that will take in a list of attributes?

Thanks for your help.

3 Answers 3

9

This is updated version for 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));

}
Sign up to request clarification or add additional context in comments.

Comments

3

I have modified Alexandr code a bit with lambda expression, in case anyone needed the lambda expression.

usage:

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

code:

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));
    }

Comments

2

I'd suggest creating your own HtmlHelper extension method and using a TagBuilder to create the label.

 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 );
      }
 }

See the MVC source code for ideas on how to create a strongly-typed label helper. Note that you'll need to add the namespace containing your extensions either to the page or the web.config to be able to use it.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.