更新パネルにラップされた単純なフォーム(テキストボックス、送信ボタン)があります。
<asp:UpdatePanel ID="ReplyUpdatePanel" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<asp:Textbox id="ReplyTextBox" runat="server"/>
<asp:Button id="SubmitButton" OnClick="SubmitButton_Click" runat="server"/>
<ContentTemplate>
</asp:UpdatePanel>
したがって、ボタンをクリックすると、サーバー側のクリックイベントが発生し(SubmitButton_Click)、データベースに何かが発生し、ページが(非同期で)再レンダリングされます。
これが私の問題です-すべての「データベースに何かが起こった」後にJavaScriptを実行する必要があります。
言い換えれば、データ/パラメーターがサーバー側のロジックに基づいているJavaScriptを作成する必要があります。
私はこれを試しました:
Page.RegisterStartupScript
この
ScriptManager.RegisterStartupScript
どちらも機能しません(何も起こりません)。
.add_pageLoaded
これで、クライアント側のAJAXライブラリを使用して関数にフックできます(部分的な更新が完了したらクライアント側のスクリプトを実行します)が、問題は、ボタンクリックイベントで作成されたサーバーからのデータが必要なことです。
すなわち:
Sys.Application.add_init(function () {
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function (sender, args) {
var panels = args.get_panelsUpdated();
for (var i = 0; i < panels.length; i++) {
// check panels[i].id and do something
}
});
});
現時点で考えられる唯一の「ハック」は、上記を実行することですが、Webサービスを呼び出して、すべてのデータを再度取得してから、スクリプトを実行します。非同期のポストバックを実行する必要がないため、「ハック」と言います。after-partial-postbackイベントハンドラーにフックしてから、以前に投稿された情報を取得するためだけにサーバーを再度呼び出します。
一般的な問題のようです。いいえ、UpdatePanelを削除することはできません(削除したいのですが)。理由を議論する時間を無駄にしたくありません。
ハッキーではないアイデアはありますか?
編集
スクリプトに送信する必要のあるデータの明確化:
テキストボックスにテキストを入力し、[送信]をクリックすると、サーバーはデータベースレコードを作成し、ID、名前、URL、Blahなどのプロパティを持つオブジェクトを返します。これらはスクリプトに必要な値です。
したがって、クライアントコードからWebサービスを呼び出す場合、作成されたばかりの値を取得するには、いくつかのハックを実行する必要があります(テキストボックスの値を持つ最後のレコードを変更します)。理想的ではなく、1つのフォーム投稿に対して2つのAJAX呼び出しも理想的ではありません。(パネルのポストバックを更新してから、Webサービスを呼び出します)。