He creado un pequeño ejemplo aquí solo para replicar el problema. Tengo un establecimiento inflexible vista parcial _Name.cshtml:MVC 3 Razor @ Html.ValidationMessageFor no funciona en la carga parcial a través de jquery.load()
@model ValidationInPartial.ViewModels.MyViewModel
<h2>@ViewBag.Message</h2>
<fieldset>
<legend>Name</legend>
<div class="editor-label">
@Html.LabelFor(model => model.MyName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.MyName)
@Html.ValidationMessageFor(model => model.MyName)
</div>
<a href="#" id="reload">Reload Name</a>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<script type="text/javascript">
$(document).ready(function() {
$("#reload").click(function() {
$("#divName").load("Home/NameReload");
});
});
</script>
que se carga y se visualiza dentro de la principal Index.cshtml
<div id="divForm">
@using (Html.BeginForm()) {
<div id="divName">
@Html.Partial("_Name")
</div>
}
</div>
Se requiere que el MyName campo y validación se implementa a través atributo requerido inicialmente en MyViewModel
namespace ValidationInPartial.ViewModels
{
public class MyViewModel
{
[Required(ErrorMessage = "Please enter a Name.")]
public string MyName { get; set; }
}
}
vez que la página se carga la primera vez, si hace clic en el botón Crear dejando el campo vacío del válida mensaje de ación "Por favor ingrese un nombre". muestra al lado del campo y el campo en sí se vuelve rosa, que es el comportamiento esperado. ahora haciendo clic en el enlace "Actualizar Nombre", que hace un llamada AJAX (jquery.load (...)), se volverá a cargar el parcial, aquí está el código del controlador:
public PartialViewResult NameReload()
{
MyViewModel myViewModel = new MyViewModel();
ViewBag.Message = "Name Reloaded";
return PartialView("_Name", myViewModel);
}
Esta vez si hace clic en el Crear botón dejando el campo vacío El mensaje de validación no aparece al lado del campo, aunque el campo se vuelve rosa. Resulta que al volver a cargar el parcial, @ Html.ValidationMessageFor no procesa el mensaje de validación como la primera vez.
Aquí es los archivos de jQuery utilizo
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
Me pregunto si esto es un error en la forma en que el motor de la maquinilla de afeitar hace que el Html.ValidationMessageFor @ o es que un problema con jQuery? ¿Alguna idea de por qué sucede esto?
También he leído en alguna parte que la llamada ajax pierde todos los scripts para la página, de hecho, tengo que mantener el código javascript dentro del parcial para que puedan ser renderizados y utilizados nuevamente.
Mientras tanto encontré una solución que se va a hacer de forma manual en el parcial de lo que se suponía iba a ser prestados por @ Html.ValidationMessageFor que es:
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="MyName"></span>
Sin embargo esta solución significa que si cambiamos el tipo de validación o solo el mensaje de validación dentro del atributo Requerido en el modelo de vista, necesitamos modificar este fragmento de html codificado en la vista.
Agregué esta línea en la parte superior de la vista parcial y soluciona el problema. Tan simple al final. Un millón de gracias. –
Hay instancias en las que agregar la línea que el Desarrollador ha notado no funcionará, como el uso de AJAX para obtener una vista parcial. La razón por la que esto sucede es porque la llamada AJAX no activa el complemento de validación para "volver a vincular" a los formularios en la página, lo que no debería ocurrir. En estos casos, es necesario llamar $ .validator.unobtrusive.parse ('# myPartialViewForm'); método. En mi caso, estoy usando Fancybox para renderizar un formulario cuando un usuario hace clic en el botón "agregar". Mi vista parcial llama "$ .validator.unobtrusive.parse ('# wizardForm');" para configurar la validación para la vista parcial. –
¡Amigo, eres increíble! – Darren