2011-02-08 19 views
17

Le espressioni lambda/metodi anonimi sono supportate nel motore di visualizzazione Razor?Le espressioni lambda sono supportate da Razor?

Sto avendo difficoltà ad esprimere quanto segue in Razor:

@Model.ToList().ForEach(i => 
    { 
     if (i.DealerName != null) 
     { 
      <text> 
       @i.DealerName 
      </text> 
     } 
    } 

Nota: So che può risolvere questo con @foreach ma ho bisogno di una soluzione simile per un controllo MVC 3rd party. Utilizza questo meccanismo per impostare il contenuto del controllo. Funziona bene per le viste MVC .ASPX ma non riesce a farlo funzionare con Razor.


MVC ASPX equivalente (il codice vorrei convertire in sintassi Razor):

<% Model.ToList().ForEach(i => 
     { 
      if (i.DealerName != null) 
      { 
      %> <%=i.DealerName%> <% 
      }; 
     }); 
%> 

Questo è per il motore Razor fornito con ASP.NET MVC3.

risposta

11

Invece di vostro <text>@i.DealerName</text> blocco si potrebbe usare un Response.Write(i.DealerName);

Il risultato è lo stesso, come se si elimina questo in una pagina di Razor - eseguirà durante il rendering pagina .. E francamente - sono abbastanza sicuro questo è ciò che verrà compilato in ogni caso.

Inoltre, dal momento che ForEach() restituisce nulla, dovresti rilasciarlo nella pagina come blocco di codice. Così il vostro codice sarebbe simile a questa:

@{ 
    Model.ToList().ForEach(i => 
    { 
     if (i.DealerName != null) 
     { 
      Response.Write(i.DealerName); 
     } 
    }); 
} 

UPD: Se si dispone di formattazione più grave, si può ricorrere a questo simpatico piccolo trucco:
(purtroppo il codice di colorazione qui non darà questo frammento il credito, ma sarà sicuramente vedere quello che voglio dire se si elimina questo in visual Studio. Nota: questo funziona solo nelle pagine rasoio, non file di codice :))

@{ 
    Model.ToList().ForEach(i => 
    { 
     if (i.DealerName != null) 
     { 
      Response.Write(((Func<dynamic, object>)(
       @<text> 
        <b>Hello Dealer named: @item.DealerName 
        Multiline support is <em>Beautiful!</em> 
       </text>)).Invoke(i)); 
     } 
    }); 
} 

speranza che abbia un senso :)

+0

Sì 'Risposta.Write' funziona, ma per un esempio più complesso la concatenazione delle stringhe sfugge molto rapidamente. :( –

+0

Sì, hai ragione .. Ho aggiornato il post per consentire praticamente qualsiasi tipo di codice Razor all'interno di questa funzione .. Divertiti :) –

+0

Grazie per il tuo disturbo hai preso Artiom. Mi piace particolarmente il tuo trucco multi linea. Sfortunatamente non posso cadere in un blocco di codice come questo. Come ho accennato nella mia domanda, ho bisogno di fornire il mio contenuto/modello all'interno dell'espressione lambda dei produttori di componenti per costruire il controllo. Sembra così semplice nel codice .ASPX. Devo dire che le espressioni lambda non sono supportate in Razor allo stesso livello del codice MVC .ASPX? –

2

In alternativa, è possibile creare una funzione lambda, e chiamare che per ogni elemento nel corpo del codice Razor (l'idea è nata da Andy in this post):

@model IEnumerable<Dealer> 

@{ 
    Func<Dealer, object> sayHi = 
     @<text> 
      <b>Hello Dealer named: @(item.DealerName)</b> 
      Multiline support is <em>Beautiful!</em> 
     </text>; 
} 

<div> 
    @foreach(var dealer in Model.ToList()) 
    { 
     sayHi(dealer); 
    } 
</div> 
1

Sì, sono supportati. MA, il rasoio ha alcune strane regole di fuga e le parentesi graffe aggiuntive lo faranno soffocare a volte, comprese quelle in espressioni lambda estese.

È possibile semplificare le @Artioms rispondono un po 'per rimuovere quelle parentesi graffe in più con un dove e facoltativamente una clausola select

@{ 
    Model.ToList().ForEach(i => 
    { 
     if (i.DealerName != null) 
     { 
      Response.Write(i.DealerName); 
     } 
    }); 
} 

diventa

@{ 
    Model.Where(i=>i.DealerName != null).ToList().ForEach(i => 
    { 
      Response.Write(i.DealerName); 
    }); 
} 

potrebbe anche diventare

@{Model.Where(i=>i.DealerName != null).Select(i=>i.DealerName) 
    .ToList().ForEach(Response.Write);} 

Yay stili funzionali!

+0

Grazie per il feedback ma non risponde alla domanda. –

+0

Ho riformulato la parte superiore per essere un po 'più chiaro - migliora la risposta di @Artioms. Ho anche fornito un'altra soluzione alternativa: rimuovere le parentesi graffe che potrebbero potenzialmente confondere il compilatore del rasoio. Penso che sia utile, al minimo. – scaryman

Problemi correlati