Récupérer la valeur de l'attribut Display Name d'une propriété en ASP.Net MVC
mardi 8 octobre 2013 à 17:37Lorsqu'on développe en ASP.Net MVC, on a parfois besoin d'afficher un label avec un nom clair pour une des propriétés de notre ViewModel. Chose que nous faisons avec l'attribut "Display" :
Nous pouvons ensuite afficher notre label correspondant à l'aide de :
Sauf que le code généré sera un objet html "Label", sous la forme :
Donc pas toujours exploitable. En effet, il se peut que nous n'ayons besoin que de la valeur de l'attribut Display(Name) !
Et bien en fait... La solution est très simple, il suffit d'utiliser :
Evident non ? Pourtant je suis passé à côté et je l'avais recodé à la main :
La solution est parfois juste sous nos yeux...
EDIT : Sauf que voilà ! Il y a un piège ! Ce que le DisplayNameFor renvoie est encodé en HTML (vu qu'il s'agit d'une MvcHtmlString) !
Du coup, deux possibilités pour récupérer notre label sans l'encodage HTML :
Utiliser Html.Raw et HttpUtility.Decode :
Ou alors utiliser une version modifiée du GetDisplayName créé précédemment :
[Display(Name = "Nom complet")] [StringLength(50)] public string NomComplet { get; set; }
Nous pouvons ensuite afficher notre label correspondant à l'aide de :
@Html.LabelFor(model => model.NomComplet)
Sauf que le code généré sera un objet html "Label", sous la forme :
<label for="NomComplet">Nom complet</label>
Donc pas toujours exploitable. En effet, il se peut que nous n'ayons besoin que de la valeur de l'attribut Display(Name) !
Et bien en fait... La solution est très simple, il suffit d'utiliser :
@Html.DisplayNameFor(model => model.NomComplet)
Evident non ? Pourtant je suis passé à côté et je l'avais recodé à la main :
public static MvcHtmlString GetDisplayName<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { var metaData = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData); string displayName = metaData.DisplayName ?? (metaData.PropertyName ?? ExpressionHelper.GetExpressionText(expression)); return MvcHtmlString.Create(displayName); }
La solution est parfois juste sous nos yeux...
EDIT : Sauf que voilà ! Il y a un piège ! Ce que le DisplayNameFor renvoie est encodé en HTML (vu qu'il s'agit d'une MvcHtmlString) !
Du coup, deux possibilités pour récupérer notre label sans l'encodage HTML :
Utiliser Html.Raw et HttpUtility.Decode :
@Html.Raw(HttpUtility.HtmlDecode(Html.DisplayNameFor(model => model.NomComplet).ToString()))
Ou alors utiliser une version modifiée du GetDisplayName créé précédemment :
public static IHtmlString GetDisplayName<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { var metaData = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData); string displayName = metaData.DisplayName ?? (metaData.PropertyName ?? ExpressionHelper.GetExpressionText(expression)); return htmlHelper.Raw(displayName); }