2012-09-26 44 views
6

Quiero llamar a "OnFailure" cuando ModelState no es válido en el controlador.Ajax.BeginForm OnFailure invocado cuando ModelState es InValid

En Mi LoginView

@using (Ajax.BeginForm("Login", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "Login",InsertionMode = InsertionMode.Replace, OnSuccess = "Success", OnFailure = "onError" })) 
{ 

} 

En Controlador

[httpPost] 
public ViewResult Login(LoginModel model) 
{ 
    if (ModelState.IsValid) 
    { 

    } 
    else 
    { 
    ModelState.AddModelError("login is fail") 
    } 
    return View("Login",model) 
} 

así que quiero llamar onSuccess método si ModelState es válido y si falla, entonces llamada sólo OnError método con pantalla de todos los errores que están en Modelo Estado.

+0

¿Qué haces en la función de éxito? ¿Redirige? Por lo que entiendo, quiere mostrar mensajes de error en caso de que la validación falle => desea devolver una vista parcial que contenga el formulario de inicio de sesión y luego actualizar la parte correspondiente de su DOM. ¿Pero qué pasa con el caso de éxito? ¿Qué quiere devolverle al cliente en este caso? ¿Una vista? –

+0

Gracias Darin por reproducirme sí, quiero redireccionar en éxito, pero en caso de error solo quiero llamar a OnFailure con mensaje de error. actualmente en la aplicación que llama al método de éxito incluso ModelState no es válido – Shivkumar

Respuesta

19

Esto es lo que podría hacer:

[HttpPost] 
public ActionResult Login(LoginModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // everything went fine and we want to redirect in this case => 
     // we pass the url we want to redirect to as a JSON object: 
     return Json(new { redirectTo = Url.Action("SomeController", "SomeAction") }); 
    } 
    else 
    { 
     // there was an error => add an error message 
     ModelState.AddModelError("login is fail") 
    } 

    // return a partial view instead of a full vire 
    return PartialView("Login",model) 
} 

y entonces todo lo que necesita es la función de Éxito:

@using (Ajax.BeginForm("Login", new AjaxOptions { HttpMethod = "POST", OnSuccess = "loginAjaxSuccess" })) 
{ 

} 

en la que se podía probar en cuyo caso son:

function loginAjaxSuccess(result) { 
    if (result.redirectTo) { 
     // the controller action returned a JSON result => it was a successful login 
     // => we redirect the browser to this url 
     window.location.href = result.redirectTo; 
    } else { 
     // the action returned a partial view with the form containing the errors 
     // => we need to update the DOM: 
     $('#Login').html(result); 
    } 
} 

Por cierto, si está utilizando una validación discreta del lado del cliente en el caso de error donde está refrescando el formar tendrá que forzar manualmente el análisis de las nuevas reglas de validación, de lo contrario la próxima vez que intente enviar el formulario, la validación del cliente no funcionará:

} else { 
    // the action returned a partial view with the form containing the errors 
    // => we need to update the DOM 
    $('#Login').html(result); 

    // Now that the DOM is updated let's refresh the unobtrusive validation rules on the form: 
    $('form').removeData('validator'); 
    $('form').removeData('unobtrusiveValidation'); 
    $.validator.unobtrusive.parse('form'); 
} 
+0

Drin cuando uso Viewresult no me permite usar Json y también ViewResult no puede devolver PartailView – Shivkumar

+0

Deberías usar 'ActionResult', ver mi respuesta actualizada. –

+0

Gracias Darin es realmente útil – Shivkumar

6

Cuando se detecta el problema en el ModelState, ajuste el StatusCode del objeto de respuesta a algo así como 400 (Puede obtener el código de la clase System.Net.HttpStatusCode)

Eso disparará el método onfailure.

Si

+0

Esto no funciona en nuestro entorno de prueba pero funciona en mi máquina de desarrollo. En la prueba, devolver 400 no activa el método onfailure. ¿Alguna pista? – Jeff

Cuestiones relacionadas