ドラッグ可能なdiv
ものを利用している小さなものがいくつかありますjQuery
。これらdiv
はに配置され、UpdatePanel
ドラッグストップで_doPostBack()
JavaScript関数を使用して、ページのフォームから必要な情報を抽出します。
私の問題は、この関数を呼び出すと、ページ全体が再ロードされますが、更新パネルのみを再ロードしたいということです。
ドラッグ可能なdiv
ものを利用している小さなものがいくつかありますjQuery
。これらdiv
はに配置され、UpdatePanel
ドラッグストップで_doPostBack()
JavaScript関数を使用して、ページのフォームから必要な情報を抽出します。
私の問題は、この関数を呼び出すと、ページ全体が再ロードされますが、更新パネルのみを再ロードしたいということです。
回答:
これが完全な解決策です
<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
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();
}
}
フォームが送信/ポストバックが発生したとき:
javascript:__doPostBack('ButtonB','')
ボタンクリックハンドラーを実行するサーバーコントロールボタンのUniqueIDを指定した場合(、、そのボタンのボタンクリックハンドラーが実行されます。引数として好きなものを渡すことができます __doPostBack
次に、非表示の入力値を分析し、それに応じて特定のコードを実行できます。
If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then
Response.Write("Do Something else")
End If
ClientIDMode="Static"
、次のようにすることができます__doPostBack('<%= myclientid.UniqueID %>', '')
。__doPostBack('<%= MYBUTTON.UniqueID %>','')
Phairohの解決策は理論的には正しいように見えますが、私はこの問題に対する別の解決策も見つけました。UpdatePanels IDをdoPostBack関数のパラメーター(イベントターゲット)として渡すことにより、更新パネルはページ全体ではなくポストバックします。
__doPostBack('myUpdatePanelId','')
*注:2番目のパラメーターは追加イベント引数用です
これが誰かに役立つことを願っています!
編集:それで、私がタイプしていたのと同じアドバイスが上で与えられたようです:)
__doPostBack
直接使用するのは2000年代です。2018年にWebFormsをコーディングする人は誰でも、GetPostBackEventReferenceを使用します
(ただし、より深刻なことに、これを完全性の答えとして追加します。__doPostBack
直接使用することは悪い習慣です(通常、単一のアンダースコアプレフィックスはプライベートメンバーを示し、ダブルはよりユニバーサルなプライベートメンバーを示します)が、おそらくこれで変更または廃止されることはありません。ポイント。ClientScriptManager.GetPostBackEventReferenceで完全にサポートされているメカニズムがあります。)
btnRefreshがUpdatePanel内にあり、ポストバックが発生すると仮定すると、GetPostBackEventReferenceを次のように使用できます(インスピレーション)。
function RefreshGrid() {
<%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>;
}
(私がそうであったように)誰かがこれに問題を抱えている場合は、UseSubmitBehavior = "false"属性をボタンに追加することで、ボタンのポストバックコードを取得できます。ボタンのレンダリングされたソースを調べると、実行する必要のある正確なJavaScriptが表示されます。私の場合、IDではなくボタンの名前を使用していました。
まず、更新パネルを使用しないでください。これらは、MicrosoftがWeb開発者のためにこれまでに作成した2番目に邪悪なものです。
次に、更新パネルを使用する必要がある場合は、UpdateModeプロパティをConditionalに設定してみてください。次に、ページに追加するAsp:Hiddenコントロールにトリガーを追加します。変更イベントをトリガーとして割り当てます。ドラッグストップイベントで、非表示のコントロールの値を変更します。
これはテストされていませんが、理論は正しいようです...これが機能しない場合は、asp:buttonで同じことを試して、display:noneスタイルを設定し、changeイベントの代わりにclickイベントを使用できます。
_doPostBack()
フォームの送信を強制するため、電話をかけることはできません。を無効にPostBack
してみませんUpdatePanel
か?