1

次のように、最初のページの読み込み時にクライアント スクリプト ブロックを追加する場合:

   if (this.Page.IsPostBack==false)
            {
                if (this.Page.ClientScript
                          .IsClientScriptIncludeRegistered("ctlmyControl")==false)
                {
                    string guidParamToHackBrowserCaching 
                                  = System.Guid.NewGuid().ToString();

this.Page.ClientScript.RegisterClientScriptInclude("ctlmyControl"
                         , ResolveUrl(String
                          .Format("~/clientScripts/ctlmyControl.js
                        ?par={0}",guidParamToHackBrowserCaching)));
                }
            }

すべてのポストバックで再登録する必要がありますか?

ありがとう、

4

2 に答える 2

2

スクリプトが存在するページの実際の部分がポストバック後に再レンダリングされる場合、はい。そうでない場合は、いいえ、実際には、複製してはいけません。

より具体的には、部分的なポストバックを使用するページと、UpdatePanelスクリプトを登録する必要があることをレンダリングするコードを使用している場合、最初のページの読み込み時以外は再登録しないでください。一方、ページが完全なポストバックまたは最初のページの読み込みで読み込まれる場合は、登録 する必要があります。ScriptManager部分的なポストバックの動的コンテンツ領域の外側にスクリプトを挿入UpdatePanelしますが、以前のポストバックでそこにレンダリングされた可能性のある既存のスクリプトは考慮されません。(これは理にかなっていますか?そうではありません。しかし、それはあります。)

ページのその部分がリロードされなかったためにスクリプトがまだクライアントに存在しているという点を除いて、スクリプトが永続化されていないということです。またScriptManager、ページの静的な部分で既にレンダリングされているものを記憶する努力もしていません。したがって、スクリプトがレンダリングされる実際の場所がポストバック (非同期または完全) で更新される場合は、スクリプトを再登録する必要があります。それ以外の場合は登録しないでください。

于 2011-03-08T15:40:55.617 に答える
0

スクリプトの目的によって異なりますが、おそらく。ポストバックすると、ブラウザーの古い DOM (スクリプトを含む) が破棄され、新しいページ インスタンスも操作されます。ページの一部としてこれが必要な場合は、まだ登録されていることを確認する必要があります。

別の方法として、必要なコントロール値が関数に渡されるパラメーターになるように、スクリプトをより静的にリファクタリングすることもできます。次に、通常のタグを使用する<scriptだけで、各ポストバックで行う必要があるのは、関数を呼び出すときに使用できる変数にコントロールの ID を書き込むことだけです。

于 2011-03-08T15:25:56.650 に答える