18 Stimmen

Wie kann man eine ID für ein Html.LabelFor<> angeben (MVC Razor)

Mögliches Duplikat:
Client Id für Eigenschaft (ASP.Net MVC)

Gibt es eine Möglichkeit, Razor ein ID-Attribut für ein Label-Element rendern zu lassen, wenn man den Html.LabelFor<>-Helper verwendet?

.cshtml page
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.Foo)
@Html.TextBoxFor(m => m.Foo)
}

Gerenderte Seite

<form ...>
<label for="Foo" id="Label_Foo" />
<input type="text" name="Foo" id="Foo" />
</form>

Zu Ihrer Information: Der einzige Grund, warum ich dem Label eine ID hinzufügen möchte, ist das CSS-Design. Ich würde es vorziehen, das Etikett durch eine ID zu referenzieren, anstatt das Etikett in einen Block (d.h. div) einzuschließen und dann den Block zu gestalten.

28voto

Darin Dimitrov Punkte 990883

Leider gibt es keine eingebaute Überladung dieses Hilfsmittels, mit der Sie dies erreichen können.

Glücklicherweise braucht man nur ein paar Zeilen Code, um eine eigene Lösung zu finden:

public static class LabelExtensions
{
    public static MvcHtmlString LabelFor<TModel, TValue>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TValue>> expression, 
        object htmlAttributes
    )
    {
        return LabelHelper(
            html,
            ModelMetadata.FromLambdaExpression(expression, html.ViewData),
            ExpressionHelper.GetExpressionText(expression),
            htmlAttributes
        );
    }

    private static MvcHtmlString LabelHelper(
        HtmlHelper html, 
        ModelMetadata metadata,
        string htmlFieldName, 
        object htmlAttributes
    )
    {
        string resolvedLabelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
        if (string.IsNullOrEmpty(resolvedLabelText))
        {
            return MvcHtmlString.Empty;
        }

        TagBuilder tag = new TagBuilder("label");
        tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
        tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        tag.SetInnerText(resolvedLabelText);
        return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
    }
}

und verwenden Sie diese Hilfsfunktion in Ihrer Ansicht, sobald sie in den Geltungsbereich gebracht wurde:

@Html.LabelFor(m => m.Foo, new { id = "Foo" })
@Html.TextBoxFor(m => m.Foo)

Anmerkung: Da es nun an Ihnen liegt, die HTML-Kennungen zu verwalten, sollten Sie sicherstellen, dass sie im gesamten Dokument eindeutig sind.

Bemerkung2: Ich habe schamlos plagiiert und die LabelHelper Methode aus dem ASP.NET MVC 3-Quellcode.

1voto

Actionman Punkte 67

Und für das normale Etikett @Html.Label() können Sie wie folgt vorgehen:

public static HtmlString Label(this HtmlHelper helper, string target = "", string text = "", string id = "")
{
    return new HtmlString(string.Format("<label id='{0}' for='{1}'>{2}</label>", id, target, text));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X