2012-02-28 12 views
10

Estoy tratando de habilitar la validación de JavaScript discreta para los elementos creados dinámicamente. El problema con javascript ya se resolvió en otra pregunta de SO y este no es el caso aquí.ASP.NET MVC Validación no intrusiva: ¿por qué se necesita contexto?

La creación dinámica de elementos en este caso es simplemente la clonación de un elemento vacío que se genera fuera del formulario principal.

El problema es que si uso html helpers como TextBoxFor, CheckBoxFor, ... fuera del elemento de formulario html no se generan los atributos necesarios para que la validación funcione (por ejemplo, data-val-required).

Ya he comprobado el código fuente de MVC y hay una línea que devuelve la lista de atributos vacía si FormContext es nulo. (esto no arroja excepciones)

¿Por qué?

Respuesta

20

Puede falsificar manualmente un contexto de formulario. Por ejemplo, si tiene alguna vista parcial que no contiene un elemento <form> y que se denomina el uso de AJAX para regenerar algunos elementos de entrada que podría hacer esto:

@model MyViewModel 
@{ 
    ViewContext.FormContext = new FormContext(); 
} 

@Html.LabelFor(x => x.Foo) 
@Html.EditorFor(x => x.Foo) 
@Html.ValidationMessageFor(x => x.Foo) 

Los elementos de entrada correspondientes ahora poseerán los atributos data-*. Pero eso podría no ser suficiente. Si solo está actualizando (utilizando AJAX), solo una parte de <form> pero no reemplazando realmente el elemento de formulario en DOM llamando al $.validator.unobtrusive.parse no sería suficiente. Debe eliminar todas las validaciones anteriores asociadas a este elemento:

success: function(result) { 
    // we are replacing only a portion of the form 
    $('#somePartOfTheForm').html(result); 

    $('form').removeData('validator'); 
    $('form').removeData('unobtrusiveValidation'); 
    $.validator.unobtrusive.parse('form'); 
} 
+3

¡Esta respuesta debe aceptarse! – Marko

+0

Amigo ... después de horas de usar todas las recetas alrededor de esto funcionó como un amuleto. ¡Gracias! – Romias

+0

Más información general: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html – Jowen

Cuestiones relacionadas