true textboxfor mvc labelfor htmlhelper htmlattributes example c# asp.net-mvc asp.net-mvc-3 lambda html-helper

c# - textboxfor - html.labelfor htmlattributes



MVC HTML Helpers y Lambda Expressions (2)

Entiendo las consultas de Lambda en su mayor parte, pero cuando intento aprender MVC, y veo las plantillas de Scaffolding predeterminadas, usan expresiones Lambda para tantos componentes.

Uno por ejemplo es DisplayFor HTML Helper. El código va @Html.DisplayFor(model => model.name)

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

Entonces la pregunta realmente es,

1) ¿hay algún beneficio que me falta usando consultas Lambda para estos HTML Helpers?

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

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


Antes de responder 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. Desde MSDN :

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

Estas son esencialmente estructuras de datos que describen lo que se pasa en lugar de los valores de los datos que se pasan. Lo que esto significa es que cuando llamas a Html.DisplayFor(x => model.Name) está pasando en una estructura de datos que dice "Estoy llamando 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 su Modelo de Vista).

El DisplayFor luego mira estos datos y ve que el nombre de la propiedad Name is well Name, mira todos los atributos de la propiedad para averiguar si tiene alguna anotación de datos, y luego mira el valor para determinar cómo representar la pantalla para 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 de ViewModel.Name a ViewModel.ClientName , no se compilará todo Html.DisplayFor(x => model.Name) , por lo tanto, asegúrese de cambiarlos. Si no utiliza expresiones lambda, todas sus llamadas Html.Display() funcionarán, pero obtendrá errores ocultos con el enlace de 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 los árboles de expresiones. Sin utilizar lambdas, solo está pasando el valor de Model.Name sin información sobre la propiedad en sí, por lo que no sabe si 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 here . Comprender los árboles de expresión abre una gran cantidad de poder en .Net :)


Usted tiene la opción de usar una alternativa, similar a la que tiene arriba. En este caso, 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 el nombre de las cosas constantemente. Al activar la compilación de vista , puedo apoyarme en el compilador para ayudarme a encontrar los lugares que necesito para actualizar mis vistas.