现在验证表单经常会用到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异步的问题。
多更新写MVC的