Comment spécifier un ID pour un Html.LabelFor (MVC Razor) [duplicate]
Double Possible:
Identification du Client pour les biens (ASP.Net MVC)
y a-t-il un moyen de faire rendre Razor un attribut ID pour un élément Label en utilisant le Html.LabelFor helper?
Exemple:
.cshtml page
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.Foo)
@Html.TextBoxFor(m => m.Foo)
}
page rendue
<form ...>
<label for="Foo" id="Label_Foo" />
<input type="text" name="Foo" id="Foo" />
</form>
FYI-la seule raison pour laquelle je veux ajouter un ID à L'étiquette est pour CSS design. Je préfère faire référence à L'étiquette par un ID plutôt que envelopper l'étiquette dans un bloc (c.-à-d. div) et ensuite coiffer le bloc.
2 réponses
malheureusement, il n'y a pas de surcharge intégrée de cet helper qui vous permet d'atteindre cet objectif.
heureusement, il faudrait quelques lignes de code pour mettre en œuvre les vôtres:
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));
}
}
et une fois introduit dans la portée d'utilisation de cette aide dans votre vue:
@Html.LabelFor(m => m.Foo, new { id = "Foo" })
@Html.TextBoxFor(m => m.Foo)
Remarque: parce que maintenant c'est à vous de gérer HTML id, assurez-vous qu'ils sont uniques dans tout le document.
Remark2: j'ai honteusement plagié et modifié le
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));
}