Duplicata possible:
ID client pour la propriété (ASP.Net MVC)
Existe-t-il un moyen de rendre Razor un attribut ID pour un élément Label lors de l'utilisation de l'assistant Html.LabelFor <>?
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 la conception CSS. Je préfère faire référence à l'étiquette par un ID plutôt que d'envelopper l'étiquette dans un bloc (c'est-à-dire div), puis de styliser le bloc.
Malheureusement, il n'y a pas de surcharge intégrée de cet assistant qui vous permet d'y parvenir.
Heureusement, il faudrait quelques lignes de code pour implémenter la vôtre:
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 mis à portée, utilisez cet assistant à votre avis:
@Html.LabelFor(m => m.Foo, new { id = "Foo" })
@Html.TextBoxFor(m => m.Foo)
Remarque: car maintenant c'est à vous de gérer les identifiants HTML, assurez-vous qu'ils sont uniques dans tout le document.
Remarque 2: j'ai plagié sans vergogne et modifié la méthode LabelHelper
à partir du code source d'ASP.NET MVC 3.
Et pour le label normal @Html.Label()
, vous pouvez le faire comme ceci:
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));
}