2010-10-07 10 views

Respuesta

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

Obviamente con el fin de evitar que el código espagueti es siempre una buena idea para escribir un ayudante:

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

Y luego:

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

Gracias, eso es exactamente lo que busco y más! –

+3

Tenga en cuenta que necesita los siguientes 'using's para esto: using System.Linq; utilizando System.Linq.Expressions; –

+1

¿Cuáles son las implicaciones de rendimiento de hacer esto? Me gusta la idea de usar esto en todas las vistas, pero suena mucho más complejo que solo tener el texto en .cshtml – Farinha

1

En mi opinión se debe utilizar una cadena como un tipo de resultado porque de lo contrario omite el mecanismo de codificación. Otro punto es que necesita DisplayName en algunos casos como una cadena (es decir, rellenar las columnas en una clase de WebGrid).

71

Debe intentar nueva función existente:

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

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

+0

Much más simple que la respuesta aceptada. – VDWWD

Cuestiones relacionadas