Web

论Ajax请求拦截表单时为何不能return值,异步和同步

Lan
Lan
2021-05-14 / 1 评论 / 528 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年05月14日,已超过1289天没有更新,若内容或图片失效,请留言反馈。

现在验证表单经常会用到Ajax验证,去查看用户名是否存在或者手机号是否存在啥的,为了方便,就可以使用Ajax进行验证了。

第一次遇到这个问题是上课时用.Net MVC然后里面有一个要求是验证用户名是否存在,一开始我也是半天请求之后不能进行表单拦截。

随便写了一个样例如下:

        public ActionResult Index()
        {
            return View();
        }
        public bool veruser(string username)
        {

            return true ? username.Equals("Lan") : false;
        }
@{
    ViewBag.Title = "Home Page";
}


<div class="row">
    <form class="bs-example bs-example-form" action="/" method="post">
        <div class="form-group">
            <label for="name">用户名</label>
            <input type="text" class="form-control" id="username" placeholder="请输入用户名">
        </div>
        <button type="submit" onclick="return checkUser()" class="btn btn-default">提交</button>
    </form>
</div>
@section scripts{
    <script>
        function checkUser() {
            $.ajax({
                url: "/Home/veruser",
                method: "POST",
                data: { "username": $("#username").val() },
                success: function (res) {
                    console.log("请求返回值:" + res)
                    return true ? res === "True" : false
                }
            })
        }
    </script>
}

大概是这样的,如果请求的用户名中包含Lan则返回true否则返回false

实际页面效果展示:

可以看到控制台,一次输出FALSE一次输出True,但是两次页面都跳转了,所以拦截没有成功。

然后我以为是ajax里面不能返回值,然后进行了修改,在外面指定了一个result变量,进行赋值,然后再return这个result

<script>
        function checkUser() {
            var result = false;
            $.ajax({
                url: "/Home/veruser",
                method: "POST",
                data: { "username": $("#username").val() },
                success: function (res) {
                    console.log("请求返回值:" + res)
                    result = true ? res === "True" : false
                }
            })
            console.log(result)
            return result
        }
    </script>

然后发现赋值没有附上,然后我以为是变量的作用域问题,于是又指定了一个that去指定方法中的this,于是这样赋值直接为空

然后偶尔几次,还能重新赋值,这时候考虑到是不是线程问题。

后来百度发现Ajax默认是开启异步的,恍然大悟。

于是将async关闭后。

    <script>
        function checkUser() {
            $.ajax({
                url: "/Home/veruser",
                method: "POST",
                async: false,
                data: { "username": $("#username").val() },
                success: function (res) {
                    result = true ? res === "True" : false
                }
            })
            console.log(result)
            return result
        }
    </script>

成功解决。

其实一开始我用的教室电脑,反应可能没那么快,所以能够赋值到result上,我刚刚重现的时候用的自己电脑,速度可能快一些,所以来不及赋值就走了。

之前我以为是作用域问题,然后看似好像解决了,但是其实是错误的,昨天我用Python写验证拦截的时候,发现也是直接跳转了,试了一节课,总算发现了Ajax异步的问题。

1

评论 (1)

取消
  1. 头像
    刀剑神域
    Windows 10 · Google Chrome

    多更新写MVC的表情表情

    回复