2010-09-28 34 views
8

Estoy tratando de crear mi propio HTML Helper que admite una expresión (similar al built-in LabelFor <> helper. He encontrado ejemplos para obtener el valor de una propiedad cuando la expresión es similar a esto:Obtenga valor de ASP.NET MVC Lambda Expression

model => model.Forename 

sin embargo, en algunos de mis modelos, quiero obtener las propiedades de los elementos secundarios, por ejemplo

model => mode.Person.Forename 

en estos ejemplos, no encuentro forma alguna de (fácilmente) obtener el valor de Forename. ¿Alguien puede aconsejar sobre cómo debería ser obteniendo este valor

Gracias

Respuesta

14

Si está utilizando el mismo patrón que utiliza el> método LabelFor <, entonces la expresión siempre habrá un LambdaExpression y que sólo puede ejecutarlo para obtener el valor.

var result = ((LambdaExpression)expression).Compile().DynamicInvoke(model); 

Por lo general, siempre se puede envolver expresiones genéricas en LambdaExpressions y luego compilar & invocarlos para obtener el valor.

Si lo que desea no es el valor de Forename, sino el campo en sí (fx. Para imprimir la cadena "Forename"), entonces su única opción es usar alguna forma de expresión. En C# 4 el framework proporciona una clase llamada ExpressionVisitor que se puede usar para esto, pero para versiones anteriores del framework debe implementarlo usted mismo - vea: http://msdn.microsoft.com/en-us/library/bb882521(VS.90).aspx

7

¿Estás buscando la relación?

¿Por qué no funcionaría?

public object GetValue<T>(Expression<Func<T>> accessor) 
    { 
     var func = accessor.Compile(); 

     return func.Invoke(); 
    } 
4

He respondido esto por separado porque había dos cosas No me gustó la respuesta aceptada.

  1. No explica cómo obtener una referencia al modelo que es una pieza crítica de información al escribir un ayudante HTML personalizado
  2. Si sabe cuál es el tipo de delegado para la expresión lambda es el principio que es innecesario lanzarlo a la expresión Lambda y usar DynamicInvoke. En mi experiencia de escribir ayudantes personalizados, suelo saber por adelantado los tipos.

Ejemplo en el que sé en la delantera que está diseñado para una expresión lambda que produce una matriz de bytes:

public static MvcHtmlString MyHelper<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, byte[]>> expression) 
    { 

     var compiledExpression = expression.Compile(); 
     byte[] byteData = compiledExpression(htmlHelper.ViewData.Model); 

     ... 
     ... 
     ... 

     return new MvcHtmlString(.......); 
    } 
Cuestiones relacionadas