ASP.NET自定义validation器+ WebMethod + jQuery

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

我使用的WebMethod非常简单

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

CustomValidator看起来像这样

  

和简单的$ .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; } }); } 

问题是页面立即validation,实际上并没有等待ajax调用完成。 如果页面上有任何其他错误,它会显示validation摘要,但从不显示自定义validation程序的错误消息。

我可以看到在Firebug中进行的AJAX调用,它会重新响应正确的响应(在这种情况下为truefalse

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

  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 。 你的第一次尝试不起作用的原因是,在validation脚本已经检查了args.IsValid之前,没有调用ajax成功回调。 使用async:false,$ .ajax调用将在成功回调完成后才会完成。

这个问题的一大问题是它现在“阻塞”任何js线程正在运行validation。 在ASP.Netvalidation器的情况下,我不认为这是一个问题,但我会用一个长时间运行的电话来测试它,以确保你没有搞任何人在慢速连接上的页面。