0

更新パネルの外側にある ASP.NET 4.0 アプリケーションで Telerik RAD Editor コントロールを使用しています。同じページで、予期しない完全なポストバックを防ぐために、いくつかの ModalPopUps と更新パネルを使用しています。JavaScript 関数 & から呼び出される Pagemethods がいくつかあります。また、JavaScript 関数からも呼び出されるサーバー側のボタン クリック イベントもいくつかあります。プロセス中に、Page が以下の強調表示された Javascript エラーをスローすることがよくあります。その後、JavaScript 関数がそれ以上処理されないか、サーバー側のメソッドまたはイベントがさらに呼び出されず、プログラムがハングします。ローカル サーバーでホストされ、以下に定義されているエラーが発生すると、アプリケーションはさらに JavaScript 呼び出しで機能しなくなります。

エラー メッセージの送信元:

function Sys$WebForms$PageRequestManager$_endPostBack(error, executor, data) {
        if (this._request === executor.get_webRequest()) {
            this._processingRequest = false;
            this._additionalInput = null;
            this._request = null;
        }
        var handler = this._get_eventHandlerList().getHandler("endRequest");
        var errorHandled = false;
        if (handler) {
            var eventArgs = new Sys.WebForms.EndRequestEventArgs(error, data ? data.dataItems : {}, executor);
            handler(this, eventArgs);
            errorHandled = eventArgs.get_errorHandled();
        }
        if (error && !errorHandled) {
            **throw error;**
        }
    }

上記のマークされた領域でエラーがスローされます。

以下に定義された方法を試しましたが、このエラーの反映を停止するか、このエラーをスキップして、アプリケーションの通常のプロセスサイクルを妨げる影響を与えないようにするという同じことをまだ確定できていません。

解決策1を試しました。 最初に、更新パネルの下にあるコントロールを登録し、ページの読み込みでサーバー側のイベントを実行しようとしました。

ScriptManager ScrMgr = 新しい ScriptManager(); ScrMgr.RegisterAsyncPostBackControl(this.LstBoxXSD);

解決策 2 を試しました。 次に、更新パネル内でコントロールを非同期トリガーにバインドしようとしました。

**<asp:AsyncPostBackTrigger ControlID="LstBoxXSD" EventName="SelectedIndexChanged"/>**

解決策 3 を試しました。 次に、jquery からサード パーティのエディター コントロールの KeyDown イベントを使用する必要があり、そのエディター コントロール内の IFrame を「KeyDown」イベントでフックしましたが、更新後に pannel が非同期ポストバックを実行すると、バインドが解除されました。私はJQueryで以下のコードを実行して、エディター内のIframeとKeyDownイベントの間のフックされたバインディングを維持しました。

**<script language="javascript" type="text/javascript">
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
    function EndRequestHandler(sender, args) {
        $(document).ready(function () {
            $(function () {
                $('#3rdPartyControl_contentIframe').contents().find("body").bind("keydown", function (e) {
                    e = e || window.event; // because of Internet Explorer quirks... 
                    var code = e.which || e.charCode || e.keyCode; ;
                    if (code == 49 && !e.altKey && !e.ctrlKey && !e.shiftKey) {
                        // alert(code);
                    } else if (code == 65 && e.altKey) {
                        //   alert(code);
                    }
                    else if (code == 83 && e.altKey) {                       
                        SelectElement();
                    }
                    else if (code == 80 && e.altKey) {
                        if (String($find("3rdPartyControl").getSelectionHtml().trim()).length > 0) {
                            RemoveParentElem();
                        }
                    }
                    else if (code == 82 && e.altKey) {
                        if (String($find("3rdPartyControl").getSelectionHtml().trim()).length > 0) {
                            RemoveElem();
                        }
                    }
                    else {
                    }
                });
            });
        });
    }
</script>**

そして重要なのは、ボディタグの後に上記の JQuery コードを実行したことです。このエラーの生成を停止するか、とにかくエラーをバイパスできる前述の問題から可能な解決策を教えてください。プロジェクトの終了が完全に延期されたためです。

4

1 に答える 1

0

なんらかの方法で、更新パネルの子コントロール イベントから初めていくつかのセッション変数を書き込むためです。この解析エラーを回避するには、次のいずれかの解決策に従う必要があります。 1. Page.Trace.IsEnabled = false; 同期ページロードと非同期ページロード内でトレースを無効にする必要があります。if(!Page.IsPostBack) { Page.Trace.IsEnabled=false; } そうでなければ (ScriptManager.GetCurrent(this.Page).IsInAsyncPostBack) { Page.Trace.IsEnabled = false; }

2. ページ プロパティに EnableEventValidation="false" を追加します。

3.ページが初めて読み込まれるときにセッション変数に初期値を入力して、Cookie を作成します。

于 2013-02-08T06:58:47.950 に答える