Tengo problemas para intentar que la validación de jquery discreta funcione con una vista parcial que se carga dinámicamente a través de una llamada AJAX.
He pasado días intentando que este código funcione sin suerte.
Aquí está la vista:
@model MvcApplication2.Models.test
@using (Html.BeginForm())
{
@Html.ValidationSummary(true);
<div id="res"></div>
<input id="submit" type="submit" value="submit" />
}
La vista parcial:
@model MvcApplication2.Models.test
@Html.TextAreaFor(m => m.MyProperty);
@Html.ValidationMessageFor(m => m.MyProperty);
<script type="text/javascript" >
$.validator.unobtrusive.parse(document);
</script>
El modelo:
public class test
{
[Required(ErrorMessage= "required field")]
public int MyProperty { get; set; }
}
El controlador:
public ActionResult GetView()
{
return PartialView("Test");
}
y finalmente, el javascript:
$(doument).ready(function () {
$.ajax({
url: '/test/getview',
success: function (res) {
$("#res").html(res);
$.validator.unobtrusive.parse($("#res"));
}
});
$("#submit").click(function () {
if ($("form").valid()) {
alert('valid');
return true;
} else {
alert('not valid');
return false;
}
});
La validación no funciona. Incluso si no completo ninguna información en el cuadro de texto, el evento de envío muestra la alerta ('válida').
Sin embargo, si en lugar de cargar dinámicamente la vista, uso @Html.Partial("test", Model)
para representar la Vista parcial en la Vista principal (y no hago la llamada AJAX), entonces la validación funciona bien.
Probablemente esto se deba a que si cargo el contenido de forma dinámica, los controles aún no existen en el DOM. Pero hago una llamada a la $.validator.unobtrusive.parse($("#res"));
que debería ser suficiente para informar al validador sobre los controles recién cargados ...
Alguien puede ayudar ?
unobtrusive.parse
función toma un selector como argumento, no como elemento.