ASP.NET 自定义验证器 + Web方法 + jQuery
我正在尝试实现一个 .NET 自定义验证器,它使用 $.ajax 查询同一页面上的 WebMethod 并返回一个布尔值来指示结果是 true 还是 false。
我使用的 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)
I'm trying to implement a .NET Custom Validator that uses $.ajax to query a WebMethod on the same page and return a boolean value to indicate whether the result is true or false.
The WebMethod I'm using is really simple
[WebMethod()]
public static bool IsPromoValid(string code)
{
string promoCode = "ABCDEFG";
bool result = code.ToLower() == promoCode.ToLower();
return result;
}
The CustomValidator looks like this
<asp:CustomValidator ID="cvPromoCode" Display="None" ControlToValidate="txtPromoCode" runat="server" ClientValidationFunction="validatePromo"
ErrorMessage="The promo code you entered is incorrect" OnServerValidate="ValidatePromoCode" />
And the simple $.ajax() ClientValidation function
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;
}
});
}
The problem is that the page validates instantly and doesn't actually wait for the ajax call to finish. If there are any other errors on the page, it shows the Validation Summary with them, but never shows the error message from the Custom Validator.
I can see the AJAX call being made in Firebug, and it returs the right response (in this case true or false)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
简单的方法是将验证更改为:
特别注意
async:false
。您的第一次尝试不起作用的原因是,直到验证脚本已经检查了 args.IsValid 之后,才调用 ajax 成功回调。使用 async:false 时,$.ajax 调用只有在成功回调完成后才会完成。最大的问题是它现在“阻止”任何正在运行验证的 js 线程。对于 ASP.Net 验证器,我不认为这是一个问题,但我会通过长时间运行的调用来测试它,以确保您不会为连接速度慢的任何人搞砸页面。
The easy way is by changing your validate to:
Take special note of the
async:false
. The reason your first try didn't work is that the ajax success callback was not getting called until after the validation scripts had already checked args.IsValid. With async:false, the $.ajax call won't complete until after the success callback is done.The big issue with this is that it now "blocks" whatever js thread is running the validation. In the case of ASP.Net validators, I don't believe this is an issue but I would test it with a long-running call just to make sure you aren't screwing up your page for anyone on a slow connection.