Antwort

109
<p> 
    <%= Html.Encode(
     ModelMetadata.FromLambdaExpression<YourViewModel, string>(
      x => x.SomeProperty, ViewData).DisplayName 
    ) %> 
<p> 

Offensichtlich, um die Spaghetti-Code zu vermeiden, ist es immer eine gute Idee ist, einen Helfer zu schreiben:

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); 
    } 
} 

Und dann:

<p> 
    <%: Html.GetDisplayName(x => x.SomeProperty) %> 
</p> 
+0

Danke, Das ist genau das, was ich bin nach plus mehr! –

+3

Beachten Sie, dass Sie folgende 'using's benötigen: using System.Linq; mit System.Linq.Expressions; –

+1

Welche Auswirkungen hat dies auf die Leistung? Ich mag die Idee, dies in allen Ansichten zu verwenden, aber es klingt viel komplexer als nur den Text in der .cshtml – Farinha

1

Meiner Meinung nach sollten Sie ein verwenden string als Ergebnistyp, da sonst der Codiermechanismus übersprungen wird. Ein weiterer Punkt ist, dass Sie den DisplayName in einigen Fällen als Zeichenfolge benötigen (d. H. Die Spalten in einer WebGrid-Klasse auffüllen).

71

sollten Sie versuchen, neue vorhandene Funktion:

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

Razor: @ Html.DisplayNameFor (Modell => Modell.SomeProperty) –

+0

Much einfacher als die angenommene Antwort. – VDWWD