2012-09-26 4 views
6

Desidero chiamare "OnFailure" quando ModelState non è valido nel controller.Ajax.BeginForm OnFailure richiamato quando ModelState è InValid

Nel mio LoginView

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

} 

controller

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

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

in modo che io voglio chiamare il metodo onSuccess se ModelState è valida e se fallire allora chiamo solo OnError metodo con display tutti gli errori che sono in Modello Stato.

+0

Cosa fai nella funzione successo? Ti reindirizza? Da quanto ho capito, vuoi visualizzare i messaggi di errore nel caso in cui la convalida fallisca => vuoi restituire una vista parziale contenente il modulo di accesso e quindi aggiornare la porzione corrispondente dal tuo DOM. Ma per quanto riguarda il caso di successo? Cosa vuoi tornare al cliente in questo caso? Una vista? –

+0

Grazie a Darin per la riproduzione di me sì, desidero reindirizzare in Success ma in Failure voglio chiamare solo OnFailure con un messaggio di errore. attualmente in applicazione chiama su metodo Success anche ModelState non è valido – Shivkumar

risposta

19

Ecco cosa si potrebbe fare:

[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) 
} 

e poi tutto ciò che serve è la funzione di Successo:

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

} 

in cui si potrebbe verificare nel qual caso si trovi:

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); 
    } 
} 

Se si utilizza la convalida lato client non invadente in caso di errore in cui si sta aggiornando il formare dovrete forzare manualmente l'analisi delle nuove regole di convalida, altrimenti la prossima volta che si tenta di inviare il modulo, la validazione client non funzionerà:

} 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 quando uso Viewresult non mi permette di usare Json e anche ViewResult non può restituire PartailView – Shivkumar

+0

Si dovrebbe usare 'ActionResult', vedere la mia risposta aggiornata. –

+0

Grazie Darin è davvero utile – Shivkumar

6

Quando si rileva il problema nel ModelState, impostare il StatusCode dell'oggetto di risposta a qualcosa come 400 (È possibile ottenere il codice dalla classe System.Net.HttpStatusCode)

In questo modo verrà attivato il metodo onfailure.

Si

+0

Questo non funziona sul nostro ambiente di test ma funziona sulla mia macchina di sviluppo. Durante il test, la restituzione di 400 non attiva il metodo onfailure. Qualche indizio? – Jeff