2010-09-06 7 views
5

Wie erstelle ich einen ASP.Net MVC Helper für ein Html.Label, das Attribute aufnimmt?ASP.Net MVC Html.Label mit Attributliste?

Derzeit, wenn ich eine Html.TextBox definiere, kann ich eine Liste von Attributen übergeben. Wie folgt:

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

Es sieht jedoch nicht so aus, als ob das Html.Label diese Funktion hat. Daher muss ich meine Labels mit dem Label-Tag definieren. Wie folgt:

Ich möchte konsistent sein Ich wie mein HTML-Element erstellt wird.

Also, wie erstelle ich ein Html.Label, das eine Liste von Attributen aufnehmen wird?

Danke für Ihre Hilfe.

Antwort

2

Ich würde vorschlagen, erstellen Sie Ihre eigene HtmlHelper-Erweiterung-Methode und mit einem TagBuilder, um das Etikett zu erstellen.

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

Siehe MVC source code für Ideen, wie ein stark typisierte Label Helfer zu erstellen. Beachten Sie, dass Sie den Namespace mit Ihren Erweiterungen entweder zur Seite oder zur web.config hinzufügen müssen, um sie verwenden zu können.

9

Dies ist die Version für MVC3 aktualisiert:

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

wirklich funktioniert :) –

3

I Alexandr Code ein wenig mit Lambda-Ausdruck geändert haben, kann jeder bei der Lambda-Ausdruck benötigt.

Nutzung:

@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)); 
    } 
+0

perfekte Lösung. – dotTutorials