Helpers MVC HTML e Lambda Expressions

Capisco le query Lambda per la maggior parte, ma quando cerco di imparare MVC e vedo i modelli di Scaffolding predefiniti, usano espressioni Lambda per così tanti componenti.

Uno per esempio è l’Helper DisplayFor HTML. Il codice passa @Html.DisplayFor(model => model.name)

Spero che nessuno pensi che questa sia una domanda stupida, è solo che mentre io (penso che) comprendessi le espressioni di Lambda per la maggior parte, non “fluiscono” come un normale codice e devo pensarci abbastanza difficile da capire cosa sta realmente accadendo!

Quindi la domanda è davvero,

1) C’è qualche vantaggio che mi manca per loro usando le query Lambda per questi helper HTML?

2) Per quanto posso dire, DisplayFor sarà sempre collegato solo a un elemento, quindi, perché non è solo @Html.DisplayFor(model.name) o simile?

E per favore fornisci qualsiasi altra informazione che possa rendere un novizio MVC migliore!

Prima di rispondere ai tuoi 2 punti elenco, penso che tu debba capire quali sono le espressioni lambda in realtà.

In. Net, le espressioni Lambda utilizzate in questo modo sono quelle che vengono chiamate Expression Trees. Da MSDN :

Gli alberi di espressione rappresentano il codice in una struttura di dati ad albero, in cui ciascun nodo è un’espressione, ad esempio una chiamata di metodo o un’operazione binaria come x

Si tratta essenzialmente di strutture di dati che descrivono ciò che viene trasmesso piuttosto che i valori dei dati passati. Ciò significa che quando si chiama Html.DisplayFor(x => model.Name) passa in una struttura dati che dice “Sto chiamando questo metodo per la proprietà Name della struttura dati xxxx (dove xxxx è il tipo di struttura dati che rappresenta il tuo View Model).

DisplayFor quindi esamina questi dati e vede che il nome della proprietà Name è well Name, esamina tutti gli attributi per la proprietà per scoprire se ci sono annotazioni di dati ad essa associate e poi guarda il valore per determinare come rappresentare il display per il valore. È un po ‘complicato finché non ti si avvolge la testa, ma quando guardi la pagina MSDN e ci pensi, avrai un aha! un momento come quello che ho fatto, e improvvisamente avrà senso 🙂

Per quanto riguarda la tua domanda n. 1, il vantaggio dell’uso delle espressioni lambda è il controllo del tempo di compilazione delle tue proprietà. Ad esempio, se si rinomina ViewModel.Name in ViewModel.ClientName , tutto il tuo Html.DisplayFor(x => model.Name) non verrà compilato, assicurandosi in tal modo di cambiarli. Se non si utilizzano espressioni lambda, tutte le chiamate a Html.Display() funzioneranno, ma si otterranno bug nascosti con l’associazione del modello che non saranno immediatamente evidenti di ciò che è sbagliato.

Per rispondere a # 2, il motivo è lo stesso della mia descrizione degli alberi di espressione. Senza usare lambda, stai solo passando il valore di Model.Name senza informazioni sulla proprietà stessa, quindi non conosce il nome della proprietà Model.Name è Name , tutto ciò che vede è il valore della stringa.

Un altro buon resoconto di Expression Trees può essere trovato qui . Comprendere gli alberi di espressione apre molto potere in .Net 🙂

Hai la possibilità di utilizzare un’alternativa, simile a ciò che hai sopra. In questo caso sarebbe in realtà @Html.Display("name") senza la parte “For” e con il nome della proprietà del modello passato come stringa. Questa è un’alternativa OK. Se il nome della tua proprietà cambia, questo si interromperà in fase di esecuzione.

Mi piacciono i lambda perché sono un drogato refactoring che rinnova costantemente le cose. Attivando la compilation di visualizzazione, posso quindi appoggiarmi al compilatore per aiutarmi a trovare i luoghi che mi servono per aggiornare le mie visualizzazioni.