现在,我有一个包含多个字段的表单,在提交时,我想检查用户名是否已被占用。如果被采纳,什么都不做(显示验证错误),如果没有被采纳,成功进入下一个表单。
这是我到目前为止所做的:
查看:
var RequestCreateAccount_Submit = function () {
var res = false;
ValidationAttribute.BlankValue(true);
var form = $('form#RequestCreateAccount');
$.validator.unobtrusive.parse(form);
var res = form.valid();
var data = form.serialize();
if (res) {
$.ajax({
url: Url.getFullUrl('Account/RequestCreateAccount_Submit'),
type: 'Post',
data: data,
cache:false,
success: function (data) {
//Next Dialog
},
error: AjaxLog.HandleAjaxCallFail
});
}
return res;
}
Controller :
[AllowAnonymous]
[HttpPost]
public ActionResult RequestCreateAccount_Submit(UserAccount userAccount)
{
//Check if username is unique
if (!WebSecurity.UserExists(userAccount.UserName))
{
UserSession.AddValue(StateName.CreateOrEditAccount, "CurrentUserAccount", userAccount);
JsonResult res = Json(new { Success = true, data = "", Message = "" });
return res;
}
JsonResult jres = Json(new { Success = false, data = "", Message = "Username is already registered"});
return jres;
}
我用一个已知的用户名对其进行了测试,它确实命中了 success=false(在 if 语句之外)行,但它没有进入 if 语句。所以我知道服务器端的验证有效。
但是,我想知道为什么在客户端,它仍然是 success = true 并且出现下一个对话框。验证没有失败。我在客户端做错了什么?
最佳答案
原因是您的 Controller 确实成功返回了结果。只是成功的结果表示错误。虽然在这一点上逻辑相似,但它们非常不同。错误将保留用于实际抛出的异常或 404 无路由存在类型的场景。
您应该在成功回调函数中检查响应状态
$.ajax({
url: Url.getFullUrl('Account/RequestCreateAccount_Submit'),
type: 'Post',
data: data,
cache:false,
success: function (data) {
if(data.Success === false){
AjaxLog.HandleAjaxCallFail();
// this may not make as much sense though
// as the request didn't actually fail, just the action did
//TODO: code for name fail
return;//do not process next dialog
}
//Next Dialog
},
error: AjaxLog.HandleAjaxCallFail
});
关于javascript - 为什么验证不会在客户端失败但在服务器端失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31059958/