ユーザーが価格(数値)を入力する入力フィールドのリストを含むフォームがあります。jQuery検証プラグインがそれに応じて検証するように、cssクラスを「required」と「number」に設定しました。すべてが完全にうまく機能しています。エラーは、各フィールドが数値でないか、値が欠落している場合などに表示されます。
このフォーム全体は、実際にはnyroModal(jQueryプラグイン)モデルのポップアップウィンドウ内にあります。しかし、それは問題ではありません。それは関係なく、単なる.aspxWebフォームです。その中で、私はUpdatePanelも使用し、その中にすべてを入れました。私のフォームは基本的に2段階のプロセスだからです。ユーザーがフォームの最初の「ページ」で完了する必要のある基本的な手順がいくつかあります。それが検証されて機能するとき、UpdatePanel内のいくつかの要素を非表示/表示して、フォームの次の「ページ」をユーザーに表示します。これは、上記のすべての価格テキストボックス入力フィールドです。
フォームを検証するためのトリガーポイントとしてImageButtonを使用しています。デフォルトでは、ImageButtonをそのままにしておくと、すべてUpdatePanel内で発生するため、.Netはポストバック(私の場合はAJAXポストバック)を起動します。これもまた望ましい。明らかな理由で、醜い完全なポストバックは必要ありません。
たくさん読んだ後、jQueryがフォームを正常に検証したかどうかに基づいて、.Netがポストバックを実行したいときにインターセプトできるように、JavaScriptで.NetのPageRequestManagerにアタッチする方法が必要でした。したがって、私のロジックは次のように述べています。デフォルトでは、ポストバックを許可しませんが、jQueryがフォームを正常に検証したら、ポストバックが許可されるようになったことを示す変数を設定します。次にポストバックが実行されると、それが実行されます。したがって、ユーザーに成功を表示します。
これはすべてかなりうまく機能していますが、最後の問題が1つあります。
jQuery検証プラグインのvalidate({success})オプションは、フォーム全体ではなく、個々のフィールドで検証が成功した後、誤って起動しているようです。つまり、価格入力フィールドのいずれかに数値を入力すると、この成功オプションが起動し、cancelPostback変数がfalseに設定されます。これは、1つのフィールドがあるという理由だけで、検証されていなくてもフォームが送信されることを意味します。有効でした。このvalidate({success})オプションは、フォーム全体が検証された後にのみ起動することを期待していました。
私はこれを間違って解釈しましたか、そして実際にそれはそれが意図したことをしているのですか?もしそうなら、フォーム全体が検証されたときにのみ、cancelPostback変数をtrueに設定するにはどうすればよいですか?
洞察や頭を上げてくれてありがとう。
検証を実装し、.NetポストバックイベントをインターセプトするためのjQueryコードは次のとおりです。
<script type="text/javascript">
// By default, don't allow Postback until we've successfully validated our form on the client-side.
var cancelPostback=true;
// Every single time the page loads, including every single AJAX partial postback
function pageLoad()
{
// Reset the value to say that "We don't allow Postbacks at this stage"..
cancelPostback=true;
// Attach client-side validation to the main form
$("#<%= form1.ClientID %>").validate({ success: function() { alert('validation succeeded!'); cancelPostback = false; } });
// Grab a reference to the Page Request Manager
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(onEachRequest);
alert("Page Load");
}
// Our own custom method to be attached to each new/future page request..
function onEachRequest(sender, args)
{
alert("About to cancel? " + cancelPostback);
// Check to see if we need to Cancel this Postback based on Conditional Logic within this page..
args.set_cancel(cancelPostback);
}
</script>