2010-10-07 24 views

risposta

109
<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> 
+0

Grazie, Questo è esattamente quello che sto cercando e molto di più! –

+3

Si noti che è necessario il seguente 'using's per questo: using System.Linq; utilizzando System.Linq.Expressions; –

+1

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

1

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).

71

Si dovrebbe provare la nuova funzione esistente:

<% Html.DisplayNameFor(m => m.YourProperty) %> 
+3

Rasoio: @ Html.DisplayNameFor (model => model.SomeProperty) –

+0

Much più semplice della risposta accettata. – VDWWD

Problemi correlati