ASP.NET 自定义验证器 + WebMethod + jQuery

Posted

技术标签:

【中文标题】ASP.NET 自定义验证器 + WebMethod + jQuery【英文标题】:ASP.NET Custom Validator + WebMethod + jQuery 【发布时间】:2011-04-28 07:12:30 【问题描述】:

我正在尝试实现一个 .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() ClientValidation 函数

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 调用完成。如果页面上有任何其他错误,它会显示验证摘要,但不会显示来自自定义验证器的错误消息。

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

【问题讨论】:

【参考方案1】:

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

 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 恢复正常,我也收到“不正确的代码”。

以上是关于ASP.NET 自定义验证器 + WebMethod + jQuery的主要内容,如果未能解决你的问题,请参考以下文章

asp.net中复选框的自定义验证器

ASP.Net Core MVC - 自定义验证

ASP.NET 4.5 自定义验证属性。 IsValid() 调用太晚了

ASP.NET MVC5 自定义身份验证

自定义属性的 ASP.NET MVC 客户端验证

ASP.NET 自定义验证器客户端和服务器端验证未触发