2010-12-03 18 views
2

これは全く同じ質問です。回答はthisと同じです。ScriptManagerが複数のスクリプトをページに追加する(重複して)

(編集)注:this未回答の投稿は、UpdatePanelのusercontrolのScriptManager.RegisterClientScriptBlockによって<head>に追加される余分なスクリプトが重複を引き起こしているという動作を正確に説明しています。 C#.NET 4.0。ページは次のように構成されています。

MasterPage 
    Page 
     UserControl1 (ascx) - loaded in code by Page 
     UpdatePanel 
      UserControl2 (ascx) - loaded in code by UserControl1 

初めて本文が期待通りに追加されました。 UserControl2をのOnInitで簡単にコード、:

ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "myscript", script, true); 

私も、私は上に複製同じスクリプトキーをしたくないので、本当に意味がありません「この」の代わりにページを参照して試してみましたユーザーコントロールがページに複数回読み込まれても、それは動作しませんでした。

部分的なポストバックの後、スクリプトは再び追加されますが、本体のページではなく<head>に興味があり、興味深いことに、asp.netが通常追加する通常の//<![CDATA[...//]]>ラッパーが欠けています。

UserControl1によって追加された別のスクリプトは、部分的なポストバック後もまったく同じ方法で複製されます。

これはなぜ起こっているのですか?

+0

どのようにスクリプトを登録しますか?ページ全体が生成されるときのみ? – akonsu

+0

あなたはリンクされている質問には答えがあるようです... – Chris

+0

@Chris申し訳ありませんが、あなたは正しいですが、それは私の問題ではない、おそらくそれは受け入れられていませんでした。私は同じタイプとキーを使用しています。私は他の人がこの問題を他のところで尋ねてきましたが、説明や答えは見つけませんでした。 –

答えて

2

ページのInit/Load/PreRender/Render関数内に簡単なIsPostBack句でコードをラップしようとしましたか?これにより、最初のページが読み込まれた後にスクリプトが登録されなくなります。

if(!IsPostBack) 
{ 
    ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "myscript", script, true); 
} 
+1

私はこれを行うことはできません。なぜなら、ポストバックの後初めてUserControlをページに動的にロードできるからです。 –

+0

私はこれについて肯定的な文書を見つけることはできませんが、これは実際にはScriptManagerの設計であると信じています - 状態を維持しないので、 "タグ"は特定のページの負荷に対して重複を防ぐだけです。解決策は状態を維持する方法でそれを拡張することですが、基本的には正しいです。 –

+0

これは、@ Scripts.Render( "MyASPNETMVC5Bundle") ' –

2

スクリプトを再度登録する前に、スクリプトが登録されているかどうかを確認するためのチェックを追加することができます。

if (!Page.ClientScript.IsClientScriptRegistered (Page.GetType(), "myscript")) 
    ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "myscript", script, true); 

これが役立ちます。

+0

自動的に行うScriptManagerの全体的なポイントではありませんか?そして私がPage.GetType()でそれを登録した場合、私は(あなたが "これ"を意味すると思います)初期登録と一致しません。私はそれを試してみるが、意味をなさないと思われる。 –

+0

いいえ。登録を確認すると、まだ登録されていないと表示されます。私は実際には、任意のページの負荷で何度も関数を呼び出しているわけではないので、前の部分的なポストバックからの登録が永続化されていると思います。 –

3

私はこの方法について多くの議論を見つけることができませんが、ScriptManagerはステートレスです。したがって、部分的なポストバックにわたって同じタグを持つスクリプトを追加すると、重複が発生します。実際には(私のために)これは、同じタグを持つUserControl内に複数回登録するスクリプトは重複していて、再登録してはならないと想定しているので、多くの場合、望ましい動作ではありません。新しいスクリプトを実際に登録したい場合(たとえば、部分的なポストバックの後に起こった結果)、ScriptManagerが新しいタグを再度登録する必要があると思います。

私の解決策は、初めてコントロールが読み込まれたときにのみスクリプトを登録し、ViewStateで状態情報を維持するメソッドを持つUserControlsで使用するカスタムScriptManagerを作成することです。つまり、最初に登録する予定のスクリプト用のタグのリストを保持し、そのタグをポストバック中に保持し、そのリストに見つからないスクリプトのみを再登録します。ユーザーコントロールの一般的なサポートであり、一度だけ登録する必要があるスクリプトは、この方法で追跡されます。

私がIsPostBackを使うことができない理由は、時々Page.LoadControlを使用してusercontrolsを動的にロードすることです。コントロールが最初にページ全体が読み込まれるときに読み込まれることは保証されていません。つまり、初めてポストバックに読み込むことができます。したがって、IsPostBackを使用したばかりのスクリプトは決して登録できません。