2011-05-01 5 views
25

Entiendo las consultas Lambda en su mayor parte, pero cuando intento aprender MVC, y veo las plantillas de Scaffolding predeterminadas, usan expresiones Lambda para tantos componentes. Por ejemplo, DisplayFor HTML Helper. El código va @Html.DisplayFor(model => model.name)MVC HTML Helpers y Lambda Expressions

Espero que nadie piense que es una pregunta estúpida, es solo que mientras yo (creo que) entiendo las expresiones Lambda en su mayor parte, no "fluyen" como el código normal y tengo pensar en ello bastante difícil de entender lo que realmente está sucediendo!

Así que la pregunta realmente es,

1) ¿Hay algún beneficio que me falta a ellos mediante consultas Lambda para estos ayudantes HTML?

2) Por lo que puedo decir, el DisplayFor solo se conectará a un solo elemento, entonces, ¿por qué no es solo @Html.DisplayFor(model.name) o similar?

¡Y proporcione cualquier otra información que pueda mejorar a un novato de MVC!

+2

Gracias Wil, por hacer esta pregunta, he estado luchando con el mismo concepto al aprender MVC 3 –

Respuesta

6

Tiene la opción de usar una alternativa, similar a la que tiene arriba. En este caso, realmente sería @Html.Display("name") sin la porción 'For', y con el nombre de la propiedad del modelo pasado como una cadena. Esta es una buena alternativa. Si el nombre de su propiedad cambia, esto se interrumpirá en el tiempo de ejecución.

Me gustan las lambdas porque soy un adicto a la refactorización que cambia constantemente el nombre de las cosas. Por turning on view compilation Puedo apoyarme en el compilador para ayudarme a encontrar los lugares que necesito para actualizar mis vistas.

+0

+1: ese enlace !! – ANeves

23

Antes de responder a tus 2 puntos, creo que debes entender qué son realmente las expresiones lambda.

En .Net, las expresiones Lambda utilizadas de esta manera son lo que se llama Expression Trees. De MSDN:

árboles de expresión representan el código en una estructura de datos en forma de árbol, donde cada nodo es una expresión, por ejemplo, una llamada a un método o una operación binaria tal como x < y.

Estas son esencialmente estructuras de datos que describen lo que se aprobó en lugar de los valores de los datos que pasan en. Lo que esto significa es que cuando se llama a Html.DisplayFor(x => model.Name) que está pasando en una estructura de datos que dice: "soy llamar a este método para la propiedad nombre de la estructura de datos xxxx (donde xxxx es el tipo de estructura de datos que representa la vista de modelo).

el DisplayFor luego mira a estos datos y ve que el nombre de la propiedad Name es nombre bien, examina todos los atributos de la propiedad para averiguar si tiene alguna anotación de datos adjunta, y luego mira el valor para determinar cómo representar la pantalla de la propiedad. el valor. Es un poco complicado hasta que te salta la cabeza, pero una vez que mires la página de MSDN y pienses en ello, ¡tendrás un aha! momento como lo hice, y de repente tendrá sentido :)

En cuanto a su pregunta n. ° 1, la ventaja de usar expresiones lambda es que obtiene la verificación del tiempo de compilación de sus propiedades. Por ejemplo, si cambia el nombre a ViewModel.Name a ViewModel.ClientName, no se compilará su Html.DisplayFor(x => model.Name), por lo tanto, asegúrese de cambiarlos.Si no usa expresiones lambda, todas sus llamadas a Html.Display() funcionarán, pero obtendrá errores ocultos con el enlace del modelo que no será inmediatamente obvio de lo que está mal.

Para responder # 2, la razón es la misma que mi descripción de árboles de expresiones. Sin usar lambdas, solo está pasando el valor de Model.Name sin información sobre la propiedad en sí, por lo que no conoce el nombre de la propiedad Model.Name es Name, todo lo que ve es el valor de la cadena.

Otro buen resumen de Expression Trees se puede encontrar en here. Comprender los árboles de expresión abre una gran cantidad de poder en .Net :)

+0

Gracias a KallDrexx por explicar esto, he estado luchando para comprender este concepto también en el aprendizaje de MVC 3 –

+0

¿No solo con '' Model.name' obtendrá el mismo resultado? –

Cuestiones relacionadas