C# ASP.NET自定义验证程序+;WebMethod+;jQuery

C# ASP.NET自定义验证程序+;WebMethod+;jQuery,c#,asp.net,jquery,validation,customvalidator,C#,Asp.net,Jquery,Validation,Customvalidator,我正在尝试实现一个.NET自定义验证器,它使用$.ajax在同一页面上查询WebMethod,并返回一个布尔值来指示结果是真还是假 我使用的WebMethod非常简单 [WebMethod()] public static bool IsPromoValid(string code) { string promoCode = "ABCDEFG"; bool result = code.ToLower() == promoCode.ToLower(); return res

我正在尝试实现一个.NET自定义验证器,它使用$.ajax在同一页面上查询WebMethod,并返回一个布尔值来指示结果是真还是假

我使用的WebMethod非常简单

[WebMethod()]
public static bool IsPromoValid(string code)
{
    string promoCode = "ABCDEFG";
    bool result = code.ToLower() == promoCode.ToLower();
    return result;
}
CustomValidator如下所示

<asp:CustomValidator ID="cvPromoCode" Display="None" ControlToValidate="txtPromoCode" runat="server" ClientValidationFunction="validatePromo"
    ErrorMessage="The promo code you entered is incorrect" OnServerValidate="ValidatePromoCode" />
问题是页面会立即进行验证,实际上不会等待ajax调用完成。如果页面上有任何其他错误,它会显示带有这些错误的验证摘要,但不会显示来自自定义验证器的错误消息

我可以在Firebug中看到AJAX调用,它返回正确的响应(在本例中为true或false)

简单的方法是将验证更改为:

 function validatePromo(src, args) {
    var isValid;
    $.ajax({
        type: "POST",
        url: "Register.aspx/IsPromoValid",
        data: "{'code': '" + args + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false,
        success: function (msg) {
             isValid = msg.d;
        }        
    });
    args.IsValid = isValid;
}
请特别注意
async:false
。第一次尝试不起作用的原因是,在验证脚本检查args.IsValid之后,才会调用ajax成功回调。如果使用async:false,则在成功回调完成之前,$.ajax调用不会完成


最大的问题是它现在“阻塞”了运行验证的js线程。对于ASP.Net验证程序,我不认为这是一个问题,但我会通过一个长时间运行的调用来测试它,以确保您不会因为连接速度慢而破坏页面

请注意,我没有使用变量isValid,根据您的回答,我只是将async更改为false。我得到了“错误的代码”,即使msg.d返回为真。
 function validatePromo(src, args) {
    var isValid;
    $.ajax({
        type: "POST",
        url: "Register.aspx/IsPromoValid",
        data: "{'code': '" + args + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false,
        success: function (msg) {
             isValid = msg.d;
        }        
    });
    args.IsValid = isValid;
}