2011-09-07 25 views
13

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

+0

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. –

Respuesta

17

¿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 
    } 
} 
+4

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. –

+1

No funciona para mí porque, en caso de error, debo devolver una vista, no un JSON. – Misi

+0

Creo que primero tienes que verificar el tipo del resultado: if (typeof (resultado) == "object" && result.success) { – Misi

25

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.

+1

'OnSuccess =" UpdateSuccessful (data) "': realmente útil. Gracias. –

+0

¿Este objeto ** "data" ** funciona en todos los navegadores? ¿Tiene alguna limitación o problemas de compatibilidad? –

+0

Esto debería funcionar en todos los navegadores que tengan habilitado JavaScript. –

3

Usted puede hacer lo siguiente:

var OnSuccess = function() { 
    if ($(".validation-summary-errors").length == 0) { 
     //Your javascript/jquery code goes here 
    } 
} 
1

variación leve en la respuesta de Luis:

function OnSuccess() { 
    if ($("span[class='field-validation-error']").length == 0) { 
     alert("Target Platform saved Successfully."); 
    } 
} 
Cuestiones relacionadas