我正在尝试实现一个 .NET 自定义验证器,它使用 $.ajax 查询同一页面上的 WebMethod 并返回一个 bool 值以指示结果是真还是假。
我使用的 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 调用,它会返回正确的响应(在本例中为 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 验证器,我认为这不是问题,但我会通过长时间运行的调用对其进行测试,以确保您不会因连接速度慢的任何人而搞砸您的页面。
关于c# - ASP.NET 自定义验证器 + WebMethod + jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982420/