Tengo un formulario de "enviar comentarios" que utiliza "Ajax.BeginForm" para representar un parcial que contiene los elementos del formulario. El evento OnSuccess se activa incluso si el ModelState no es válido. ¿Esto es normal? Esperaba poder hacer algunas devoluciones como resultado de un modelo no válido, luego, cuando el modelo es válido y no hay errores, ¿se activará el evento OnSuccess?ASP.NET MVC "Ajax.BeginForm" ejecuta OnSuccess aunque el modelo no es válido
Respuesta
¿Es esto normal?
Sí, por supuesto. Si el servidor envía HTTP 200, se llama al método OnSuccess. La noción de validez del modelo de estado es solo del lado del servidor. Siempre que la acción de su controlador regrese alguna vista/parcial/json/... se iniciará OnSuccess. Si se lanza una excepción dentro de su acción de controlador, se activará OnError en lugar de OnSuccess.
Así que con el fin de manejar este caso usted podría tener su acción del controlador hacer algo en la línea de:
[HttpPost]
public ActionResult Process(MyViewModel model)
{
if (!ModelState.IsValid)
{
return Json(new { success = false });
}
return Json(new { success = true });
}
y luego:
function success(result) {
if (result.success) {
// the model was valid
} else {
// the model was invalid
}
}
Ahora bien, en el caso del modelo no es válida podría desea mostrar los mensajes de error al usuario actualizando el formulario. Lo que podría hacer en este caso es colocar su formulario dentro de un estado parcial y en el caso de un modelo no válido, devolvería una vista parcial de la acción de su controlador y, en caso de éxito, un objeto json. Así que en su manejador de éxito que podría poner a prueba:
function success(result) {
if (result.success) {
// the model was valid
} else {
// there were errors => show them
$('#myform_container').html(result);
// if you are using client side validation you might also need
// to take a look at the following article
// http://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx
// and reattach the client validators to the form as you are
// refreshing its DOM contents here
}
}
Gracias, gracias. Esta respuesta es perfecta. Me sorprende que no haya una documentación sólida sobre cómo manejar este escenario (errores de modelo) con el discreto material de AJAX. –
No funciona para mí porque, en caso de error, debo devolver una vista, no un JSON. – Misi
Creo que primero tienes que verificar el tipo del resultado: if (typeof (resultado) == "object" && result.success) { – Misi
puedo manejar este tema con una maniobra sencilla técnica de javascript:
Primero configurar su OnSuccess
así:
OnSuccess = "UpdateSuccessful(data)"
Luego, su función javascript como esto:
function UpdateSuccessful(data) {
if (data.indexOf("field-validation-error") > -1) return;
// Do your valid stuff here
}
De esta manera, no hay necesidad de ensuciar w ITH su controlador, o más importante, su controlador puede devolver el Partial View
con los errores de los modelos sin hacer nada raro, es decir:
public ActionResult SaveDetails(Project model)
{
if (ModelState.IsValid)
{
model.SaveProject();
}
return PartialView("ProjectForm", model);
}
Y en su AjaxOptions
:
UpdateTargetId = "FormContents"
Ahora acaba de asegurarse de que tiene a div
o algo con id="FormContents"
donde quiera que se muestre su formulario.
'OnSuccess =" UpdateSuccessful (data) "': realmente útil. Gracias. –
¿Este objeto ** "data" ** funciona en todos los navegadores? ¿Tiene alguna limitación o problemas de compatibilidad? –
Esto debería funcionar en todos los navegadores que tengan habilitado JavaScript. –
Usted puede hacer lo siguiente:
var OnSuccess = function() {
if ($(".validation-summary-errors").length == 0) {
//Your javascript/jquery code goes here
}
}
variación leve en la respuesta de Luis:
function OnSuccess() {
if ($("span[class='field-validation-error']").length == 0) {
alert("Target Platform saved Successfully.");
}
}
- 1. Ajax.BeginForm no llama onSuccess
- 2. función MVC Ajax.BeginForm onSuccess no define
- 3. MVC3 Ajax.BeginForm onSuccess no se ejecuta en Firefox
- 4. ASP.NET MVC3 AJAX.BeginForm AjaxOptions OnSuccess OnFailure Problema
- 5. asp.net mvc Ajax.BeginForm
- 6. ASP.NET - Ajax.BeginForm OnSuccess devolver la llamada con los parámetros
- 7. ASP.NET MVC jQueryUI datepicker no funciona cuando se utiliza AJAX.BeginForm
- 8. NSManagedObjectModel initWithContentsOfURL no devuelve nada aunque el modeloURL es válido
- 9. Asp.NET MVC AjaxOptions OnSuccess se dispara ... ¿demasiado pronto?
- 10. Ajax.BeginForm OnFailure invocado cuando ModelState es InValid
- 11. ¿Por qué aparece el ValidationSummary aunque el ModelState es válido?
- 12. Html.CheckBoxFor no marcado aunque el valor del modelo es verdadero
- 13. Asp.Net MVC Ajax.BeginForm no está sometiendo a través de Ajax
- 14. ASP.NET MVC ValidationSummary con excludePropertyErrors = true hace que vacía si el modelo es válido
- 15. ASP.Net MVC 3.0 Ajax.BeginForm está redirigiendo a una página?
- 16. Cómo utilizar los métodos Ajax.BeginForm OnSuccess y OnFailure?
- 17. MVC Ajax.Beginform OnComplete/OnSuccess activado antes de la llamada del controlador
- 18. ¿Cómo se mide OnSuccess para ASP.NET MVC ActionLink?
- 19. ASP.NET Ajax.BeginForm envía múltiples peticiones
- 20. ASP.NET MVC 3 Ajax.BeginForm y Html.TextBoxFor no refleja los cambios realizados en el servidor
- 21. asp.net mvc: ¿por qué el modelo es nulo?
- 22. ASP.NET MVC 3 - Ajax.BeginForm vs jQuery Form Plugin
- 23. ¿ASP.Net MVC se ejecuta sobre ASP.NET 2.0?
- 24. ASP.NET MVC DropDownListPara no seleccionar el valor del modelo
- 25. ASP.NET MVC Redirigir con modelo
- 26. Estado del modelo no válido
- 27. ASP.NET MVC ha publicado el enlace de modelo de archivo cuando el parámetro es Modelo
- 28. Asp.Net MVC EnableClientValidation no funciona
- 29. Qué es ASP.NET MVC 2 formas de representar el mismo modelo de dos formas diferentes
- 30. Advertencias de modelo en ASP.NET MVC
estoy de acuerdo que este es innecesariamente compleja para trabajar con ellos. Obviamente, necesitamos un valor simple que indique si el modelo es válido o no. –