2010-09-28 14 views
8

Sto provando a creare il mio helper HTML che contiene un'espressione (simile all'helper integrato LabelFor <>. Ho trovato degli esempi per ottenere il valore di una proprietà quando l'espressione è simile a questo:Ottieni valore da ASP.NET MVC Lambda Expression

model => model.Forename 

Tuttavia, in alcuni dei miei modelli, voglio ottenere proprietà a elementi figlio, ad esempio

model => mode.Person.Forename 

in questi esempi, non riesco a trovare comunque per (facilmente) Ottieni il valore di Nome. Qualcuno può consigliare come dovrei essere ottenere questo valore.

Grazie

risposta

14

Se si utilizza lo stesso modello che il LabelFor <> metodo utilizza, allora l'espressione sarà sempre un LambdaExpression e si può solo eseguirlo per ottenere il valore.

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

In generale, si può sempre avvolgere le espressioni generiche in LambdaExpressions e quindi compilare & invocarli per ottenere il valore.

Se ciò che si desidera non è il valore di Forename, ma il campo stesso (per stampare la stringa "Forename"), l'unica opzione è usare una forma di expressionwalking. In C# 4 Il framework fornisce una classe denominata ExpressionVisitor che può essere usato per questo, ma per le versioni precedenti del quadro è necessario implementare da te - vedi: http://msdn.microsoft.com/en-us/library/bb882521(VS.90).aspx

7

Stai cercando il valore?

Perché questo non funzionerebbe?

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

     return func.Invoke(); 
    } 
4

Ho risposto a questa parte perché non c'era due cose Non mi piaceva la risposta accettata.

  1. Non spiega come ottenere un riferimento al modello che è un pezzo fondamentale di informazioni durante la scrittura di un aiutante HTML personalizzato
  2. Se si sa che cosa il tipo di delegato per l'espressione lambda è in attacco che è inutile lanciarlo sull'espressione Lambda e utilizzare DynamicInvoke. Nella mia esperienza di scrittura di aiutanti personalizzati tendo a conoscere in anticipo i tipi.

Esempio dove so fino anteriore è progettato per un'espressione lambda che produce una matrice di byte:

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(.......); 
    } 
Problemi correlati