私はかなり単純な問題であると信じている問題を抱えていますが、私の人生では、自分の問題を見ることができません。この問題は、以前に何度も使用した ScriptManager.RegisterStartupScript に関連しています。
私が持っているシナリオは、ページに挿入されたカスタム Web コントロールがあるということです。コントロール (およびその他の 1 つまたは 2 つ) は、UpdatePanel 内にネストされています。これらはページのプレースホルダーに挿入されます。
<asp:UpdatePanel ID="pnlAjax" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="placeholder" runat="server">
</asp:PlaceHolder>
...
protected override void OnInit(EventArgs e){
placeholder.Controls.Add(Factory.CreateControl());
base.OnInit(e);
}
これは、ページ上の唯一の更新パネルです。
コントロールが正しく機能するためには、最初に JavaScript を実行する必要があります。コントロールは次を呼び出します。
ScriptManager.RegisterStartupScript(this, GetType(),
Guid.NewGuid().ToString(), script, true);
そして私も試しました:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
問題は、ページが最初に表示されたときにスクリプトが正しく実行されますが、部分的なポストバック後に再実行されないことです。私は次のことを試しました:
- CreateChildControls から RegisterStartupScript を呼び出す
- OnLoad / OnPreRender から RegisterStartupScript を呼び出す
- 最初の 2 つのパラメーターにさまざまなパラメーターの組み合わせを使用します (上記の例では、コントロールは Page で、Type は GetType() ですが、コントロール自体を使用してみました)。
- 永続的な新しい ID を使用してみました (いずれにしても、これが大きな影響を与えるとは思いません)。
- いくつかのブレークポイントを使用して、Register 行が正しく呼び出されていることを確認しました。
私が試していない唯一のことは、コントロールとタイプとして UpdatePanel 自体を使用することです。これは、コントロールが更新パネルを認識する必要があるとは思わないためです (いずれにせよ、更新を取得する良い方法はないようです)。パネル?)。
上記で私が間違っている可能性があることを誰かが見ることができますか?
ありがとう :)
上記のクエリに答えると、プレースホルダーが何らかの形で ScriptManager.RegisterStartupScript を台無しにしているかのように見えます。
コントロールをプレースホルダーから取り出してページに直接コーディングすると、Register スクリプトは正しく機能します (コントロール自体もパラメーターとして使用しています)。
ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);
コントロールを PlaceHolder に挿入すると、ScriptManager がスクリプトを正しく登録できない理由を誰かが明らかにすることはできますか? これは動的コントロールのライフサイクルと関係があるのではないかと推測していますが、上記の正しいプロセスがあれば (私自身の知識では) 感謝します。