Es un truco de sintaxis que ha estado presente desde C# 3.0 (creo, tal vez 3.5).
Si se va a escribir esto en el código (y su punto de vista Razor lo hace traduce a un archivo de código C# antes de compilar, por lo que realmente es en código), hay dos maneras posibles el compilador puede compilar en función de el contexto.
Si el método LabelFor()
espera un delegado, se compila con un método anónimo. Alternativamente, si el método espera un tipo System.Linq.Expressions.Expression<Func>
, se construye un expression tree. Esto es lo que está sucediendo en tu caso.
La razón de esta sintaxis convulted es que el árbol de expresión contiene suficiente información, que (en combinación con la reflexión) el método LabelFor()
puede extraer el propiedad real al que se está refiriendo. Si tuviera que pasarlo simplemente como LabelFor(Model.UserName)
, no habría suficiente información para el LabelFor()
para hacer esto. Simplemente obtendría el valor de la propiedad UserName
. Pero ahora sabe de dónde vino, y puede usar más Reflection para echar un vistazo a los atributos de la propiedad. Atributos como DisplayFormat
, Required
y otros.
El m
(o c
o lo que sea) es en realidad su modelo. LabelFor
es un método de extensión y simplemente devuelve su modelo a su expresión Lambda, de modo que todo el truco del árbol de expresiones puede funcionar. También podría escribirlo como LabelFor(x=>Model.UserName)
, pero no creo que funcione (no lo he intentado, tal vez sí).
@NoProblemBabe, hay alguien haciendo aquí: http://stackoverflow.com/questions/2595947/asp-net-mvc-label-for –