Qual è il modo migliore per recuperare l'attributo del nome visualizzato per un articolo nel modello? Vedo un sacco di persone che usano l'helper LabelFor per tutto, ma un'etichetta non è appropriata se voglio solo elencare i dati. C'è un modo semplice per ottenere l'attributo Nome se voglio solo stamparlo, ad esempio un paragrafo?Ottieni attributo DisplayName senza utilizzare LabelFor Helper in asp.net MVC
risposta
<p>
<%= Html.Encode(
ModelMetadata.FromLambdaExpression<YourViewModel, string>(
x => x.SomeProperty, ViewData).DisplayName
) %>
<p>
Ovviamente al fine di evitare il codice di spaghetti è sempre una buona idea di scrivere un aiutante:
public static class HtmlExtensions
{
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 value = metaData.DisplayName ?? (metaData.PropertyName ?? ExpressionHelper.GetExpressionText(expression));
return MvcHtmlString.Create(value);
}
}
E poi:
<p>
<%: Html.GetDisplayName(x => x.SomeProperty) %>
</p>
A mio parere si dovrebbe usare una stringa come un tipo di risultato perché altrimenti si salta il meccanismo di codifica. Un altro punto è che in alcuni casi è necessario il DisplayName come stringa (ad esempio, inserire le colonne in una classe WebGrid).
Si dovrebbe provare la nuova funzione esistente:
<% Html.DisplayNameFor(m => m.YourProperty) %>
Rasoio: @ Html.DisplayNameFor (model => model.SomeProperty) –
Much più semplice della risposta accettata. – VDWWD
Grazie, Questo è esattamente quello che sto cercando e molto di più! –
Si noti che è necessario il seguente 'using's per questo: using System.Linq; utilizzando System.Linq.Expressions; –
Quali sono le implicazioni sulle prestazioni di questo? Mi piace l'idea di usarlo in tutte le viste, ma sembra molto più complesso del semplice testo in .cshtml – Farinha