¿Cómo instancia asp.net mvc3 la validación del lado del cliente?

Esta pregunta se relaciona más estrechamente con el marco asp.net mvc3. Comenzó como "¿Cómo puedo garantizar la validación activa de los campos de entrada agregados dinámicamente usando jQuery con asp.net mvc3?" Sin embargo, después de algunas búsquedas, pruebas y café, encontré esto:

function reValidate(formId) {
 $("#" + formId).removeData("validator");
 $("#" + formId).removeData("unobtrusiveValidation");
 $.validator.unobtrusive.parse("#" + formId);
}

Esto funciona bien. Sin embargo, tengo más curiosidad sobre el mecanismo que utiliza realmente el marco. Tengo una página que se genera completamente en base a un script. Lo único en la vista es un <div>, <script> etiqueta para cargar mi biblioteca, y otra <script> poblar el <div>. Después de renderizar una página completamente dinámica, la validación es impecable. Sin embargo, si el mismo proceso que se usó cuando se carga la página se usa después de cargar la página para incluir algún contenido nuevo, entonces la validación se interrumpe. Claro, solo llama reValidate().

Pero -

a) ¿Cómo instancia el marco la validación una vez que la página se ha cargado (o mientras se carga)?

b) ¿Qué parte del marco lo maneja? ¿Es la parte mvc3, la parte asp.net, el motor razor u otra parte?

preguntado el 12 de junio de 12 a las 19:06

2 Respuestas

a) ¿Cómo instancia el marco la validación una vez que la página se ha cargado (o mientras se carga)?

Analiza el DOM, busca data-* atributos en sus campos de entrada y agrega el reglas jquery.validate. jQuery validate es un complemento de validación del lado del cliente que no tiene nada que ver con ASP.NET MVC y podría usarse con cualquier marco del lado del servidor o incluso con HTML estático simple.

b) ¿Qué parte del marco lo maneja? ¿Es la parte mvc3, la parte asp.net, el motor razor u otra parte?

Es el jquery.validate.unobtrusive.js texto. Los ayudantes de ASP.NET MVC como Html.TextBoxFor simplemente use los metadatos del modelo para generar campos de entrada con el data-* atributos basados ​​en las anotaciones de datos que usó para su modelo. Esos atributos contienen toda la información necesaria para generar las reglas nativas de validación de jquery. Por lo tanto, la secuencia de comandos discreta hace que el pegamento entre los metadatos del modelo ASP.NET MVC y el jquery.validate enchufar. Es el $.validator.unobtrusive.parse función que hace este trabajo. Esa es la razón por la que necesita invocarlo manualmente cuando modifica dinámicamente el DOM: está agregando/eliminando data-* atributos que deben traducirse a reglas de validación de jquery. No dude en mirar cómo se implementa en el interior jquery.validate.unobtrusive.js.

Respondido el 12 de junio de 12 a las 19:06

Gracias por la respuesta de alta calidad como siempre. Una de las razones por las que tenía curiosidad sobre esto se debía a un mensaje de validación inconsistente para un menú desplegable. El mensaje no desaparecía cuando se seleccionaba una opción. Al mirar a través de la unobtrusive.js archivo que pude encontrar $(selector).valid() que volverá a evaluar una entrada y pudo incorporarla en parte de mi solución. ¡Gracias de nuevo! - travis j

¿Algún enlace relacionado con este tema para asp.net mvc 2? - andreapier

Funciona como lo describe Darin Dimitrov en su respuesta, en el lado del cliente, en el lado del servidor, el motor de renderizado mvc usa los metadatos proporcionados para el modelo (generalmente los atributos que ponemos en las propiedades de nuestras clases de modelo) para decidir qué datos son necesarios para los atributos data-*, y si deben representarse en absoluto.
Si está interesado en una respuesta más precisa, siempre puede consultar la código fuente de mvc 3, para ver exactamente cuándo y cómo los métodos auxiliares html leen los metadatos, que finalmente crean la cadena html por usted.

Respondido el 12 de junio de 12 a las 19:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.