1

更新パネル内のコンテンツを変更するボタンがあるとします。

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "New Text";
}

また、UpdatePanel が更新された後、クライアント側でいくつかのコードを実行したいと考えています。ScriptManager.RegisterClientScriptBlock私の最初のアイデアは、またはを実行することRegisterStartupScriptです:

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "New Text";

    var x = getSomeDatabaseQueryResultBasedOn(TextBox1.Text, ...);

    ScriptManager.RegisterStartupScript(this, typeof(WebForm1), "SomeKey",
        "/* this is my script, using `x` */", true)
}

ただし、RegisterStartupScript のドキュメントには次のように記載されています。

このメソッドを使用して、非同期ポストバックが発生するたびに含まれるスタートアップ スクリプト ブロックを登録します。

「非同期ポストバックが発生するたびに」このコードを実行したくありません。今だけ実行したい(ブラウザで制御が戻った後)。Button2 がクリックされた場合は、スクリプトを実行したくありません。また、Button1 が再度クリックされた場合は、異なる可能性があるため、新しいスクリプトを実行しxたいと考えています。残念ながら方法は見つかりませんでした。ScriptManager.ExecuteOnce

そのような方法はありますか?または、のドキュメントを誤解しただけRegisterStartupScriptですか?

4

2 に答える 2

0

非同期ポストバック中にStartupScriptを含めると、サーバーから送信される部分的な応答にのみ存在します。

あなたがこのようなことをするなら:

if(ScriptManager.IsInAsyncPostBack)
{
  myDiv.InnerText = "partial response";
  ScriptManager.RegisterStartupScript(Page, Page.GetType(), DateTime.Now.ToString("ssfff"), "alert(0);"), true);
}

応答は次のようになります。

|blabla|blabla|updatePanel_ctrl00|someparams
<div>partial response</div>
<script> alert(0); </script>

したがって、JavaScriptのその部分は、応答が受信されるとすぐに実行されます。

于 2012-04-04T19:09:43.260 に答える
0

そのドキュメントの次の行には、次のように記載されています。

「UpdatePanel コントロールが更新されたときにのみスクリプトが登録されるように、UpdatePanel コントロール内にあるコントロールのスクリプト ブロックを登録するには、このメソッドの RegisterClientScriptBlock(Control, Type, String, String, Boolean) オーバーロードを使用します。」

それはあなたが望むものではありませんか?

于 2012-04-04T16:24:57.360 に答える