.net mvc jquery客户端验证问题

时间:2011-06-25 15:28:20

标签: jquery asp.net-mvc-2 validation

我正在使用.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远离我提供正确的结果。

自定义验证的所有其他内容都已正确实现,因为我已经实现了一些其他自定义验证。

提前致谢!

1 个答案:

答案 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...
    };
};