我正在使用.net 4和mvc 2以及注释进行验证。我建立了一个自己的validationAttribute,以检查我的数据库中是否已存在电子邮件。 c#函数ismailexisting()返回正确的值,但javascript不能正常运行。 javascript / jquery-part看起来像这样:
Sys.Mvc.ValidatorRegistry.validators["isexisting"] = function (rule) {
return function (value, context) {
$.ajax({
url: "/persons/ismailexisting",
type: "POST",
data: { email: value },
success: function (data) {
//alert("success: " + data);
if (data == "yes") {
return false;
}
}
})
return true;
return rule.ErrorMessage;
};
};
如果电子邮件已经存在,则函数ismailexisting()返回“yes”,否则返回“no”。 如果存在电子邮件(因此数据为“是”),则javascript应该阻止用户继续,因为他必须输入其他电子邮件。 如果我取消注释alert(),则数据的值是正确的。但有些事情使得javascript远离我提供正确的结果。
自定义验证的所有其他内容都已正确实现,因为我已经实现了一些其他自定义验证。
提前致谢!
答案 0 :(得分:0)
默认情况下,AJAX调用是异步的,因此您无法从回调中返回函数的值。在AJAX调用返回响应之前,该函数已返回值true。你可以通过在AJAX调用的选项中设置async: false
来解决这个问题。请注意,这也会阻止在等待服务器响应时在页面上运行任何其他javascript,因此请谨慎使用。另请注意,回调中的返回仅从该函数返回,而不是封闭的验证器函数。从外部作用域设置捕获变量的值,然后从验证器返回该变量的值。
Sys.Mvc.ValidatorRegistry.validators["isexisting"] = function (rule) {
return function (value, context) {
var result = true;
$.ajax({
url: "/persons/ismailexisting",
type: "POST",
async: false, // force the call to run synchronously
cache: false, // we probably don't want to use a cached result
data: { email: value },
success: function (data) {
//alert("success: " + data);
if (data == "yes") {
// set captured value for return
result = false;
}
}
})
return result;
//return rule.ErrorMessage; // you'll never reach this...
};
};