Vamos a desglosar esta información mediante el examen de la firma del método:
MvcHtmlString EditorFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
Esto es usando la sintaxis de método de extensión, lo que significa que está añadiendo un método llamado EditorFor
a HtmlHelper
de tal manera que se puede realizar la llamada Html.EditorFor
. Pero lo que realmente nos interesa es el segundo parámetro, Expression<Func<TModel, TValue>>
. Es un parámetro bastante complicado, pero por ahora podemos ignorar el hecho de que es Expression
. Así simplificar, vamos a examinar:
Func<TModel, TValue> expression
Esto significa que el argumento es cualquier método que tiene un parámetro (de tipo TModel
) y el tipo de retorno es TValue
. Has estado usando lambdas, que es (esencialmente) una representación más concisa de un método, pero es útil pensar en él como un método ordinario. Por lo que está lambda está tomando un modelo y devolver un modelo:
m => m
Eso no es tan interesante, así que vamos a comparar a un escenario más realista donde se está volviendo una vivienda sobre el modelo:
m => m.MyStringProperty
Ahora vamos a comparar con un método estático ordinario se ha declarado en alguna parte:
public static class MyStaticClass
{
public static string Foo(TModel model)
{
return model.MyStringProperty;
}
}
Aunque realmente aquí no sería TModel
- sería lo que declaró su tipo de modelo a través del @model
. Ahora, por el bien de la discusión, que podría haber en su lugar se utiliza este método en su invocación de EditorFor
:
Html.EditorFor(MyStaticClass.Foo);
Para resumir, lambdas son (en su mayor parte) a poca mano por un método regular. Entonces, lo único que estás haciendo es pasar métodos.
La última nota aquí es que en realidad estamos usando árboles de expresiones, lo que significa que en realidad no está pasando el método, está pasando un modelo de objetos (un árbol de expresiones) que representa el código del método. Esto es, esencialmente, solo usado para descubrir el nombre de la propiedad que estás usando (porque usualmente el lambda sería más como m => m.MyProperty
, no simplemente m => m
). Esto es todo para evitar cadenas mágicas donde se refiere al nombre de la propiedad usando una cadena (es decir, "MyProperty").
"y no ve ninguna sobrecarga para pasar en un solo parámetro" - 'EditorFor' es un método de extensión, por lo que está buscando una sobrecarga con dos parámetros, el primero es" esto ". – hvd
También una cosa que recomendaría al construir un sitio en mvc3 es usar los tipos específicos de editores como '@ Html.TextBoxFor (m => m.name)' esto es para que, si alguna vez quieres un valor predeterminado, trabajará. Donde yo (al menos) no he podido asignar esto a un 'EditorFor'. También TextBox/TextArea etc. admite marcadores de posición entre otras cosas donde 'EditorFor' no. por lo que podría hacer '@ Html.TextBoxFor (m => m.Name, new {placeholder =" John Doe "})' y mvc implementará automáticamente un marcador de posición en los navegadores que lo admitan. – Jared