updatepanels を使用した部分的なポストバックについて少し理解しようとしていますが、多くのことが私を困惑させていますが、これには困惑しています。
UpdatePanel 内でタブを使用していますが、これはデータ入力アプリケーションであるため、コンテンツをユーザー コントロールに配置しているため、各タブには独自のユーザー コントロールがあります。さらに、各ユーザー コントロールにカスタム JavaScript を追加して、そのコントロール内のものに対して特定のクライアント側のものを処理します。
これを行うと、ユーザー コントロールの JavaScript が部分的なページのポストバックで起動しないことに気付きました。
これをシミュレートするために、VS2010 で非常に単純なアプリを作成しました (マスター ページで ScriptManager コントロールを備えたマスター ページを使用)。
デフォルト ページのコンテンツ パネルには次のものがあります。
<asp:UpdatePanel runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:Button runat="server" ID="Button1" Text="Partial postback" />
<br />
<asp:Panel runat="server" ID="panel"></asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
次に、ユーザー コントロールを作成し、単純にプレーン テキストと JavaScript アラートを追加しました。
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="UC1.ascx.vb" Inherits="TestWebApp_VB.UC1" %>
This is user control 1
<script> alert('control 1'); </script>
次に、コンテンツ ページのページ読み込みイベントで、コントロールをパネルに読み込みます。
Panel.Controls.Add(LoadControl("UC1.ascx"))
ボタンのクリック ハンドラーに加えて、コントロール (またはトグル時の別のコントロール) も読み込みます。
Button_Click
Panel.Controls.Clear()
Panel.Controls.Add(LoadControl("SomeControl.ascx"))
そのため、ページが最初に読み込まれるとアラートが発生しますが、ボタンをクリックしてページが部分的にポストバックされると、アラートは発生しません。
私はこれを一歩進めて、2 番目のユーザー コントロールを作成し、ボタンでコントロールの読み込みを切り替え、UpdatePanel の外側に通常のボタンを追加しました。完全なポストバックを実行すると、ロードされたユーザー コントロールの JavaScript が起動しますが、部分的なポストバックでは起動しません。
次に一歩前進し、コントロール内の JavaScript を関数に移動して、PageRequestManager または document.ready から関数を呼び出せるようにしました。
これで、2 つのコントロールにこのスクリプトが含まれるようになりました (アラートにはコントロールごとに異なるメッセージが含まれています)。
<script type="text/javascript">
function userLoad() {
alert("Identify control");
}
</script>
したがって、これをコンテンツパネルの最後に追加しました
<script type="text/javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance().add_endRequest(userLoad);
</script>
さて、javascript はすべての部分的なポストバックで起動しますが、完全なポストバックによって最後に読み込まれたコントロールの javascript を起動します。
例:
- ページは最初に UserControl1 を読み込みます - UserControl1 のアラートが発生します (ここには示されていません - userLoad 関数は jquery document.ready で呼び出されています)
- ユーザーがボタンをクリック - UserControl2 をロードする必要があります
- UserControl2 は画面に読み込まれますが、UserControl1 のアラートが発生します
少し冗長で、申し訳ありませんが、これを説明する簡単な方法が見つかりませんでした。
- -編集 - -
私が試したことの 1 つで、Scotts の提案に取り組んでいます。各コントロールの JavaScript を個別のファイルに保存し、すべてを function UC1Load() {} のような名前の関数に入れます (気まぐれな場合は、その周りに名前空間を貼り付けることもできます)。スクリプト ファイルへの参照を追加します。を介したコンテンツページ
<script src='UC1.js'>
次に、この関数を呼び出す起動スクリプトを登録します
ScriptManager.RegisterStartupScript(ctrl, ctrl.GetType(), "UserJS", "UC1Load()", True)
これに関する最大の問題は、使用されることのない一連のスクリプトをダウンロードする必要があることです。そのため、最初にスクリプトをユーザー コントロールに配置していました。