Odpowiedz

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

Oczywiście w celu uniknięcia kod spaghetti to jest zawsze dobry pomysł, aby napisać pomocnika:

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

, a następnie:

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

Dziękuję, to jest dokładnie to, co ja jestem po plus więcej! –

+3

Zauważ, że potrzebujesz następującego 'using's dla tego: using System.Linq; przy użyciu System.Linq.Expressions; –

+1

Jakie są implikacje związane z wydajnością tego działania? Podoba mi się pomysł użycia tego we wszystkich widokach, ale brzmi to o wiele bardziej skomplikowanie niż tylko tekst w .cshtml – Farinha

1

Moim zdaniem należy użyć ciąg znaków jako typ wyniku, ponieważ w przeciwnym razie pominie się mechanizm kodowania. Inną kwestią jest to, że potrzebujesz DisplayName w niektórych przypadkach jako ciąg znaków (tj. Wypełnij kolumny w klasie WebGrid).

71

Należy starać nowy istniejącą funkcję:

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

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

+0

Wiele prostsze niż zaakceptowana odpowiedź. – VDWWD