2

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を使用して、 CausesValidationfalseに設定しようとしましたが、希望はありません。:(

要約すると、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日を。皆様からのご連絡をお待ちしております。

4

1 に答える 1

1

フォームを呼び出すと__doPostBack(eventTarget, eventArgument)、送信がトリガーされます。

WebForm_OnSubmit();trueを返すと、投稿からのこれが続行されます。

WebForm_OnSubmit結果は結果に依存し、結果はValidatorOnSubmit結果に依存します

ValidatorCommonOnSubmit結果の場合Page_ValidationActive == true

以下の関数のように、あなたがまだ私と一緒にいる場合:

function ValidatorCommonOnSubmit() {
    Page_InvalidControlToBeFocused = null;
    var result = !Page_BlockSubmit;
    if ((typeof(window.event) != "undefined") && (window.event != null)) {
        window.event.returnValue = result;
    }
    Page_BlockSubmit = false;
    return result;
}

の結果はにValidatorCommonOnSubmit依存するPage_BlockSubmitため、ポストバックをブロックするのはPage_BlockSubmit == true、検証コールアウトとは何の関係もありません。

私はあなたのケースをシミュレートすることができませんでしたが、完全なコードサンプルを投稿できれば、問題を突き止めるのに役立ちます。

于 2010-06-02T10:59:05.213 に答える