.net mvc jquery客户端验证问题

问题描述

| 我正在将.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...
    };
};