问题描述
|
我正在将.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 \”),则JavaScript应阻止用户继续,因为他必须输入其他电子邮件。
如果我取消对alert()的注释,则data的值为正确的值。但是有些东西使javascript无法为我的视图提供正确的结果。
用于自定义验证的所有其他内容均已正确实现,因为我已经实现了一些其他自定义验证。
提前致谢!
解决方法
默认情况下,AJAX调用是异步的,因此您无法从回调中返回该函数的值。在AJAX调用返回响应之前,该函数已返回true值。您可以通过在AJAX调用的选项中设置ѭ1来解决此问题。请注意,这也将阻止其他任何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...
};
};