现在,我有一个包含多个字段的表单,在提交时,我想检查是否使用了用户名。如果不采取行动(显示验证错误),如果不采取,则成功进入下一个表格。
这是我到目前为止所做的:
查看:
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;
}
控制器:
[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;
}
我用一个已知的用户名对它进行了测试,它确实击中了成功= false(在if语句之外)行,并且它没有进入if语句。所以我知道服务器端的验证工作正常。
但是,我想知道为什么在客户端,它仍然成功= true并且出现下一个对话框。它在验证时没有失败。我在客户端做错了什么?
答案 0 :(得分:2)
原因是您的控制器确实成功返回了结果。只是成功的结果表明错误。虽然在这一点上逻辑上相似,但它们却截然不同。错误将保留为抛出的实际异常或404没有路由存在类型的方案。
您应该检查成功回调函数内的响应状态
<强> dotNetFiddle Demo
强>
$.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
});
答案 1 :(得分:1)
结果对象的success = false
并不意味着请求失败。它仅代表data.success
,仅此而已。 resquest仍然成功(HTTP 200),我认为这是正确的响应代码。如果您返回错误代码,例如new HttpStatusCodeResult(404, "error message");
,则表示您的请求失败,但它不是真的。
无论检查结果如何,您都可以申请工作。因此,您可以在success
回调中进行检查,而不是error
回调:
success: function(data) {
if (data.success) {
//Next Dialog
}
else {
// error message
}
}