为什么验证在客户端没有失败但在服务器端失败?

时间:2015-06-25 20:15:41

标签: javascript c# jquery asp.net-mvc asp.net-mvc-4

现在,我有一个包含多个字段的表单,在提交时,我想检查是否使用了用户名。如果不采取行动(显示验证错误),如果不采取,则成功进入下一个表格。

这是我到目前为止所做的:

查看:

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并且出现下一个对话框。它在验证时没有失败。我在客户端做错了什么?

2 个答案:

答案 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
    }
}