2011-07-20 12 views
9

Pasando de ASP.NET 2.0 (VB) a MVC 3 (C#), estoy muy confundido acerca de la sintaxis que se usa para la Vista.Pregunta de sintaxis: @ Html.LabelFor (m => m.UserName)

@Html.LabelFor(m => m.UserName) 

¿De dónde vino eso? Mi única conjetura es que representa el modelo que se está pasando a la vista. Traté de cambiar la m a la c y todavía funciona bien.

¿Es la parte de la sintaxis que implica el "=>" más de un elemento MVC, C# o Razor?

+0

@NoProblemBabe, hay alguien haciendo aquí: http://stackoverflow.com/questions/2595947/asp-net-mvc-label-for –

Respuesta

9

¿Que de dónde proceden de m?

Es el parámetro en una expresión lambda.

Mi única conjetura es que representa el modelo que se está pasando a la vista. Traté de cambiar la m a la c y todavía funciona bien.

Eso es porque el nombre no importa. Es solo un nombre de parámetro, en realidad no se refiere a ninguna variable existente.

¿Es la parte de la sintaxis que implica el "=>" más un elemento MVC, C# o Razor?

Se es C#, pero LabelFor utiliza lo que se traduce en que el compilador m => m.UserName para extraer lo que necesita para construir la etiqueta.

Este es un tema muy profundo e intrincado. Le sugiero que encuentre un libro con el que se sienta cómodo (por ejemplo, C# en profundidad es muy bueno en este tema) para comprender más. Desea leer sobre expresiones lambda y árboles de expresiones.

+0

yo no necesita un libro para él. – Tocco

+1

+1 en C# en profundidad - Jon Skeet te ama ... –

3

Eso es una expresión de Lambda, link.

El acuerdo es este: el m es una variable que recibe la instancia del modelo en la circunstancia dada.
Dentro de la etiqueta Para, llamará a una clase creada en tiempo de compilación, que tiene un método que hace lo que ha pasado como un argumento para LabelFor.

Una expresión lambda puede ser cambiada por un delegado, con exactamente los mismos resultados, excepto una pequeña mejora de rendimiento realmente menor, una vez.

La idea general es que está pasando un método para ejecutar en algún lugar del método LabelFor.

ejemplo: el método:

public void Dummy(Action<string> action) 
{ 
    if(iFeelLikeIt) {action("I feel Like it");} 
} 

debe utilizarse como:

Dummy(msg => MessageBox.Show(msg)); 
1

Esto es Lambda Expression. De MSDN:
Una expresión lambda es una función anónima que puede contener expresiones y sentencias, y se puede usar para crear delegados o tipos de árboles de expresiones.

Todas las expresiones lambda utilizan el operador lambda =>, que se lee como "goes to". El lado izquierdo del operador lambda especifica los parámetros de entrada (si corresponde) y el lado derecho contiene el bloque de expresión o instrucción. La expresión lambda x => x * x se lee "x va a x veces x".

8

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í).

+0

Ah, gracias por explicar el motivo detrás de la sintaxis extendida. – rkw

+0

Lambda expresiones un truco de sintaxis? ¡Son una característica lingüística realmente importante! –

+0

Sí. Es un truco de sintaxis muy importante. :) OK, bueno, supongo que muchas características del lenguaje podrían llamarse "trucos de sintaxis". Utilizo el término para decir "algo que se puede hacer sin usar la función, excepto que se vuelve mucho más tedioso escribir". Por ejemplo, una expresión lambda 'x => x * 2' podría reemplazarse por la más antigua' delegate (int x) {return x * 2; } 'sintaxis.O bien, si se usa para construir una 'Expresión ', entonces podría usar los métodos explícitos 'Expression' para construir el árbol. Por supuesto, el código se vuelve tedioso hasta el punto en que es inútil. Pero aún se puede hacer. –

0

LabelFor es una función Razor que tiene conocimiento del Modelo internamente. En otras palabras, el modelo reside dentro de la lógica de función LabelFor. Cuando pasa la expresión lambda, está pasando una función anónima a LabelFor para que sepa qué hacer con su objeto Modelo interno para extraer información.

Normalmente pasaría un modelo como parámetro y LabelFor utilizaría lógica interna para extraer la información necesaria. Pero en este formato, es todo lo contrario. LabelFor conoce el parámetro internamente (el Modelo) pero no sabe qué hacer con él. Usted le dice qué hacer pasando la función Lambda.

Cuando ejecuta el código, pasa la expresión Lambda como parámetro a LabelFor. LabelFor, toma la expresión lambda y la pasa una copia interna del objeto Model. La expresión Lambda devuelve la propiedad UserName del objeto Model y LabelFor la usa para construir su código HTML.

Cuestiones relacionadas