$.ajax を使用して同じページの WebMethod をクエリし、結果が true か false かを示すブール値を返す .NET カスタム バリデーターを実装しようとしています。
私が使用している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 呼び出しが終了するのを待たないことです。ページに他のエラーがある場合は、検証の概要が表示されますが、カスタム バリデーターからのエラー メッセージは表示されません。
AJAX 呼び出しがFirebugで行われていることがわかり、正しい応答 (この場合はtrueまたはfalse )が返されます。