1. ホーム
  2. javascript

[解決済み] JavaScriptによるASP.NETのポストバック

2022-02-19 13:57:17

質問

私はいくつかの小さな div を利用している jQuery ドラッグ可能です。これらの div の中に配置されます。 UpdatePanel で、dragstop上では _doPostBack() JavaScriptの関数で、ページのフォームから必要な情報を取り出しています。

問題は、この関数を呼び出すと、ページ全体が再読み込みされますが、私は更新パネルだけを再読み込みしたいのです。

どうすればいいですか?

ここに完全な解決策があります。

asp.netページのformタグ全体

<form id="form1" runat="server">
    <asp:LinkButton ID="LinkButton1" runat="server" /> <%-- included to force __doPostBack javascript function to be rendered --%>

    <input type="button" id="Button45" name="Button45" onclick="javascript:__doPostBack('ButtonA','')" value="clicking this will run ButtonA.Click Event Handler" /><br /><br />
    <input type="button" id="Button46" name="Button46" onclick="javascript:__doPostBack('ButtonB','')" value="clicking this will run ButtonB.Click Event Handler" /><br /><br />

    <asp:Button runat="server" ID="ButtonA" ClientIDMode="Static" Text="ButtonA" /><br /><br />
    <asp:Button runat="server" ID="ButtonB" ClientIDMode="Static" Text="ButtonB" />
</form>

ページのコードビハインドクラスの内容全体

Private Sub ButtonA_Click(sender As Object, e As System.EventArgs) Handles ButtonA.Click
    Response.Write("You ran the ButtonA click event")
End Sub

Private Sub ButtonB_Click(sender As Object, e As System.EventArgs) Handles ButtonB.Click
    Response.Write("You ran the ButtonB click event")
End Sub

  • LinkButtonは、__doPostBack javascript関数がクライアントにレンダリングされることを保証するために含まれています。Buttonコントロールがあるだけでは、この__doPostBack関数がレンダリングされることはありません。この関数は、ほとんどのASP.NETページでさまざまなコントロールがあることによってレンダリングされるため、空のリンクボタンは通常必要ではありません。

どうしたんですか?

2つの入力コントロールがクライアントにレンダリングされます。

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

  • __EVENTTARGET は__doPostBackの引数1を受け取ります。
  • __EVENTARGUMENT は__doPostBackの引数2を受け取ります。

このように__doPostBack関数がレンダリングされます。

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

  • 見ての通り、hidden inputに値を代入しています。

フォーム送信時/ポストバック発生時

  • ボタンクリック・ハンドラを実行したいサーバー・コントロール・ボタンの UniqueID を指定した場合 ( javascript:__doPostBack('ButtonB','') の場合、そのボタンのクリックハンドラが実行されます。

クリックハンドラを実行せず、別の処理をしたい場合はどうすればよいのでしょうか?

に引数として好きなものを渡すことができます。 __doPostBack

そして、隠された入力値を分析し、それに応じて特定のコードを実行することができます。

If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then
    Response.Write("Do Something else") 
End If

その他の注意事項

  • クリックハンドラを実行したいコントロールのIDがわからない場合はどうすればよいですか。
    • を設定することが許容されない場合 ClientIDMode="Static" であれば、次のようにすればよいでしょう。 __doPostBack('<%= myclientid.UniqueID %>', '') .
    • または __doPostBack('<%= MYBUTTON.UniqueID %>','')
    • これは、コントロールのユニークIDをjavascriptに注入します(必要な場合)。