GetPostBackEventReferenceを使用すると、ポストバックの問題が発生します。シナリオは次のとおりです。
JavaScriptモーダルポップアップダイアログがあり、このモーダルダイアログにボタンがあり、これはものを選択するために使用されていました(これはasp:buttonコントロールではありません)
この JavaScript ダイアログの HTML ボタンをクリックすると、 javascript: eval()メソッドによって MS AJAX Web サービス呼び出しが呼び出されます。そして、この MS AJAX Web サービス呼び出しは動的に生成されます。したがって、コードは次のようになります。
var serviceCall = svcCall + "(" + parameters + ")"; //dynamically generate the MS AJAX web service call here
eval(serviceCall);
//use eval to trigger the MS AJAX web service call
ご存知かもしれませんが、MS AJAX Web サービスを完了した後、完了を処理するコールバック関数を定義できます。
function OnComplete(result, userContext, methodName) {
//force to call postback manually
eval($(userContext[0]).val());
//close the javascript dialog here
}
前に述べたように、MS AJAX Web サービス呼び出しは動的に構築され、MS AJAX Web サービス呼び出しが構築されると、ポストバック値を含む userContext が渡されます (つまり、" __doPostBack('ctl00$ContentPlaceHolder1$btnSelectUser' ,'') "、したがって、javascript eval()が呼び出されると、asp:button クリック ポストバックをシミュレートします。
userContext[0] は基本的に asp:hidden フィールドの ClientID を保持し、非表示フィールドの値は Page_Load イベント中に設定されます。
protected void Page_Load(object sender, EventArgs e)
{
btnSelectUser.ValidationGroup = "popupSelect";
btnSelectUser.CausesValidation = false;
this.hdnBtnPostback.Value = Page.ClientScript.GetPostBackEventReference(btnSelectUser, string.Empty, false);
}
ご覧のとおり、これは GetPostBackEventReference を使用して asp:button (つまり btnSelectUser) の Click イベントを asp:hiddenfield にバインドし、registerForEventValidation引数を false に設定する方法です。また、別のValidationGroupを使用して、 CausesValidationをfalseに設定しようとしましたが、希望はありません。:(
要約すると、asp:button の Click PostBackEventReference (つまり __doPostback(....)) を asp:hidden フィールドの Value 属性にバインドし、javascript eval() を使用してこの隠しフィールドの値を評価し、ポストバックを手動でトリガーします。
ps btnSelectUser は asp:button コントロールであり、javascript モーダル ダイアログを呼び出すために使用されます。
わかりました、ここに問題があります:
同じページには、いくつかの asp:validator があります。たとえば、ユーザーが何も入力せずにフォームを送信した場合、ValidatorCalloutExtender は吹き出しを表示してユーザーに通知します。このバロン/validatorCalloutExtender の 1 つが出てきて、現時点で画面の上にあると想像してください。
次に、btnSelectUser (asp:button) をクリックして JavaScript モーダル ダイアログを表示し、ダイアログでユーザーを追加します。このモーダル ダイアログ内で SELECT ボタンを押すと、前述のように MS AJAX Web サービスがトリガーされます。この Web サービスが完了すると、asp:hidden フィールドの値 (つまり __doPostback(...)) を eval() し、ポストバックを手動で行います。
ただし、validatorCalloutExtender バルーンには表示があるため、この方法でポストバックをトリガーすることはできませんが、バルーン/validatorCalloutExtender を閉じると、eval() を使用した手動ポストバックは正常に機能します。さらに奇妙なのは、バルーンが表示されているときに、このモーダル ダイアログ内の [選択] ボタンを初めてクリックしたときに、ポストバックが起動されないことです。いくつかのユーザーを選択してから、[選択] ボタンをもう一度クリックします)。手動のポストバックを実行できます....そして、なぜ最初に機能しないのかわかりません。
これは本当に私を夢中にさせました。ここの誰かが助けてくれることを願っています。本当に感謝しています。どうもありがとうございました。:)
良い1日を。皆様からのご連絡をお待ちしております。