代码之家  ›  专栏  ›  技术社区  ›  Marko

ASP.NET自定义验证程序+WebMethod+JQuery

  •  6
  • Marko  · 技术社区  · 14 年前

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

    我使用的webmethod非常简单

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

    自定义验证器如下所示

    <asp:CustomValidator ID="cvPromoCode" Display="None" ControlToValidate="txtPromoCode" runat="server" ClientValidationFunction="validatePromo"
        ErrorMessage="The promo code you entered is incorrect" OnServerValidate="ValidatePromoCode" />
    

    以及简单的$.Ajax()。 客户端验证 功能

    function validatePromo(src, args) {
        $.ajax({
            type: "POST",
            url: "Register.aspx/IsPromoValid",
            data: "{'code': '" + args.Value + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                args.IsValid = msg.d;
            }
        });
    }
    

    问题是页面会立即验证,而不会等待Ajax调用完成。如果页面上有任何其他错误,则会显示包含这些错误的验证摘要,但从不显示来自自定义验证程序的错误消息。

    我可以看到Ajax调用 萤火虫 它重新做出正确的反应(在本例中 )

    1 回复  |  直到 14 年前
        1
  •  8
  •   Philip Rieck    14 年前

    这个 容易的 方法是将验证更改为:

     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验证程序,我不认为这是一个问题,但我会用一个长时间运行的调用来测试它,以确保您不会为连接速度较慢的任何人破坏页面。