javascript - 为什么验证不会在客户端失败但在服务器端失败?

标签 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;
    }

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 无路由存在类型的场景。

您应该在成功回调函数中检查响应状态

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

关于javascript - 为什么验证不会在客户端失败但在服务器端失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31059958/

相关文章:

javascript - scrollTo TweenMax 不完全停在散列上

c# - 将指向结构数组指针的指针从 C# 传递到 C++

c# - 将解决方案更新到 .NET 4.7.2 时 MSBuild 失败

javascript - CheckBoxFor 在 ASP.NET MVC 的 javascript 函数中返回以前的值

javascript - IE9 "Access is Denied"错误,访问IFrame时

javascript - 使用正则表达式过滤 url 中的问号 (?) 参数并添加 ?或者 &

javascript - 何时使用 window.opener/window.parent/window.top

c# - 运行Blazor网站时出现版式错误

Javascript onclick 和转义

javascript - 如何获取在 HTML5 Canvas 上单击的坐标?