validationmessagefor textboxfor mvc htmlhelper htmlattributes for c# razor lambda extension-methods editorfor

c# - textboxfor - validation for mvc



@ Html.EditorFor(m=> m) sintaxis lambda en MVC (4)

  1. En su ejemplo, la función lambda no sirve para nada, es cierto. Pero su uso real es para cuando quiere renderizar el editor para una propiedad del modelo: @ Html.EditorFor (m => m.SomeProperty). Las expresiones Lambda son solo una abreviatura de funciones, pero fuertemente tipadas por delegados . El concepto puede ser más familiar de Javascript:

    myFunction (función (x) {return x.SomeProperty;});

  2. La "m" no está predefinida. Está nombrando el parámetro para la segunda parte de la expresión lambda, y podría ser cualquier cosa: @ Html.EditorFor (whatever => whatever). (Se refiere a lo mismo, en este caso, el modelo de la página, independientemente de cómo lo nombre).

  3. El primer parámetro que ve en esas definiciones para Html.EditorFor no es realmente un parámetro. Notará que está usando la palabra clave this para definir los métodos de extensión . Ese parámetro hace referencia al objeto que invocó el método, en este caso, el objeto HtmlHelper <Model> .

Solo estoy aprendiendo C # y MVC, e intento entender algunos ejemplos.

@Html.EditorFor(m => m)

Finalmente me di cuenta de que ''=>'' es el operador lambda, y que significa algo así como "m tal que m". Eso realmente no tiene ningún sentido para mí. ¿Por qué no simplemente pasar en m?

Además, no veo m definido en ninguna vista con la que estoy trabajando. El modelo está definido, y supuestamente eso es lo que este método está recogiendo. ¿Cómo funciona?

Finalmente, miré la definición de Html.EditorFor, y no veo ninguna sobrecarga para pasar solo un parámetro. ¿Dónde se define esta sintaxis? http://msdn.microsoft.com/en-us/library/ee834942.aspx


Descompongámoslo examinando la firma del método:

MvcHtmlString EditorFor<TModel, TValue>( this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression )

Esto está usando la sintaxis del método de extensión, lo que significa que está agregando un método llamado EditorFor a HtmlHelper para que pueda hacer 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 una Expression . Para simplificar, examinemos:

Func<TModel, TValue> expression

Esto significa que el argumento es cualquier método que tiene un parámetro (del 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. Entonces, eres lambda y estás tomando un modelo y regresando un modelo:

m => m

Eso no es tan interesante, así que vamos a compararlo con un escenario más realista en el que está devolviendo una propiedad fuera del modelo:

m => m.MyStringProperty

Ahora vamos a compararlo con un método estático ordinario que haya 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 sea que hayas declarado tu modelo a través de @model . Ahora, por el bien de la discusión, podría haber usado este método en su invocación de EditorFor :

Html.EditorFor(MyStaticClass.Foo);

Para resumir, las lambdas son (en su mayor parte) solo una mano corta para 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 expresión, lo que significa que en realidad no está pasando el método, está pasando un modelo de objeto (un árbol de expresión) 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 la lambda sería más como m => m.MyProperty , no meramente m => m ). Esto es todo para evitar cadenas mágicas donde se refiere al nombre de la propiedad mediante el uso de una cadena (es decir, "MyProperty").


Piense en el operador => como que significa "va a", entonces (m => m) significa "m va a m", otra forma de decir que obtiene lo mismo m .

En su ejemplo, @Html.EditorFor(m => m) , m es un parámetro de entrada anónimo para la expresión lambda m => m , que es un argumento del método de extensión EditorFor . Como señaló en su pregunta, ninguna de las sobrecargas de este método toma menos de un parámetro; esto se debe a que es un Método de Extensión y el primer parámetro indica el tipo que se extiende. El segundo parámetro es una Expresión , y puede usar expresiones lambda para estos.


1.

  • @Html.EditorFor(m => m) - editor de pantalla para todo el modelo
  • @Html.EditorFor(m => m.propertyName) - editor de pantalla para propiedades específicas del modelo

2.

@Html.EditorFor(m => m) es igual a @Html.EditorFor(t => t) o @Html.EditorFor(randomName => randomName) . El nombre no importa, es solo el nombre del parámetro. El tipo para este parámetro es el tipo de modelo de vista.

Tienes que pasar la función, porque no es solo valor, lo que cuenta. Las reflexiones se utilizan para obtener atributos que describen cómo mostrar la propiedad. Mira este ejemplo

public class ResetPasswordModel { public string Username { get; set; } [DataType(DataType.Password)] public string NewPassword { get; set; } [DataType(DataType.Password)] public string PasswordConfirmed { get; set; } }

Los atributos describen que NewPassword debe ser un campo de contraseña, no una entrada normal. Si pasamos el valor, eso no sería posible.

En nuestro ejemplo, se @Html.EditorFor(m => m) para contener una entrada para el nombre de usuario y dos entradas de contraseña para las contraseñas. @Html.EditorFor(m => m.NewPassword) mostrará la entrada, que tiene el tipo de contraseña.

3.

http://msdn.microsoft.com/en-us/library/ee402949.aspx

public static MvcHtmlString EditorFor<TModel, TValue>( this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression )

Este es el método de extensión para la clase HtmlHelper. this HtmlHelper<TModel> html no es un parámetro, es el tipo de clase, esa función se extiende.