现在验证表单经常会用到Ajax验证,去查看用户名是否存在或者手机号是否存在啥的,为了方便,就可以使用Ajax进行验证了。
第一次遇到这个问题是上课时用.Net MVC然后里面有一个要求是验证用户名是否存在,一开始我也是半天请求之后不能进行表单拦截。
随便写了一个样例如下:
代码语言:javascript复制 public ActionResult Index()
{
return View();
}
public bool veruser(string username)
{
return true ? username.Equals("Lan") : false;
}
代码语言:javascript复制@{
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
代码语言:javascript复制<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关闭后。
代码语言:javascript复制 <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异步的问题。