当ModelState在控制器中无效时,我想调用“OnFailure”.
在我的LoginView中
@using (Ajax.BeginForm("Login",new AjaxOptions { HttpMethod = "POST",UpdateTargetId = "Login",InsertionMode = InsertionMode.Replace,OnSuccess = "Success",OnFailure = "onError" })) { }
在控制器中
[httpPost] public ViewResult Login(LoginModel model) { if (ModelState.IsValid) { } else { ModelState.AddModelError("login is fail") } return View("Login",model) }
所以我想调用onSuccess方法,如果ModelState有效,如果失败,那么只调用OnError方法,显示模型状态的所有错误.
解决方法
这是你可以做的:
[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) }
然后你需要的就是Success函数:
@using (Ajax.BeginForm("Login",OnSuccess = "loginAjaxSuccess" })) { }
你可以测试你在哪种情况下:
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); } }
顺便说一下,如果您在刷新表单的情况下使用不显眼的客户端验证,则需要手动强制解析新的验证规则,否则下次尝试提交表单时,客户端验证会赢得’工作:
} 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'); }