He encontrado otros temas al respecto, pero ninguno de ellos me hizo entender lo que estoy tratando de resolver.MVC 3: HTML.DisplayFor y la expresión Lambda
Estoy estudiando MVC 3 y tengo problemas con las expresiones Lambda que van con @ HTML.DisplayFor() en la plantilla de andamios.
estoy trabajando con la aplicación de ejemplo MvcMusicStore, la vista creada por el andamiaje se ve así:
@model IEnumerable<MvcMusicStore.Models.Album>
...
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Genre.Name)
</td>
entiendo que DisplayFor es un método de extensión a HTML y que se necesita una expresión como un parámetro. Investigué las expresiones de Lambda y las entiendo en otros contextos, como con cadenas enumerables. Por ejemplo:
cities.Where(s => s.StartsWith("L"));
Lo que perturba mi mente es, que en el segundo ejemplo, la primera parte de la expresión (s) se utiliza realmente en la segunda parte (s.startswith ..), así que tiene sentido y entiendo lo que el programa está haciendo con eso. Pero este no es el caso en la vista MVC 3. modelItem no se usa en ningún lado. He intentado cambiar el nombre sólo "ModelItem" a lo que de este modo:
@Html.DisplayFor(iAmWearingShortPantsToday => item.Genre.Name)
Este código funciona igual de bien, mostrando todos los elementos y valores correctamente. Esto me hace dudar de que en este caso "modelItem" se use realmente para cualquier cosa. Pero entonces, ¿por qué está allí?
También he tratado de traducir esta expresión Lambda en un delegado (que creo que es la forma corta de), así:
@(Html.DisplayFor(delegate(IEnumerable<MvcMusicStore.Models.Album> modelItem) { return item.Genre.Name; }))
Esto, sin embargo, no funciona. El error resultante es:
CS1946: Una expresión método anónimo no se puede convertir a un árbol de expresión
De ahí mi pregunta:
¿Qué es "ModelItem" bueno para? ¿Qué hace HTML.DisplayFor() con modelItem? ¿Hay otros casos tal vez, donde esta primera parte de la expresión se vuelve significativa?
Si es posible traducir esta expresión en un delegado adecuado, eso también podría ayudarme a entender qué está sucediendo exactamente.
Muchas gracias
mint -buena pregunta +1 –