部分的なポストバックを使用して Web ページでコントロールを更新できるように、UpdatePanel でユーザー コントロールを使用しようとしている Web アプリケーションがあります。
サイトのマスター ページで ScriptManager を定義しました。以下に示すように、ContentPlaceHolder の外側に配置されますが、本文のフォーム タグの内側に配置されます。
<head>
<asp:ContentPlaceHolder ID="HeadContent" runat="server" />
</head>
<body>
<form runat="server" class="form-horizontal">
<asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server" />
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
</body>
コンテンツ ページには、インライン サーバー タグを使用してデータにバインドする HTML と、以下に示すように UpdatePanel を含むユーザー コントロールがあります。
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="ClientDetail.aspx.cs" Inherits="ClientDetail" Async="true" %>
<%@ Register src="../controls/ListSelectionControl.ascx" tagname="ListSelectionControl" tagprefix="lsc" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server">
<link href="<%= ResolveClientUrl("~/css/clientdetail.css") %>" rel="stylesheet" type="text/css" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
<div>
Client: <%= this.CurrentClient.Id %> - <%= this.CurrentClient.Name %>
</div>
<div>
<lsc:ListSelectionControl ID="ItemsListSelectionControl" runat="server" />
</div>
</asp:Content>
ユーザー コントロールの UpdatePanel には、項目をあるリストから別のリストに移動するための 2 つのリストボックスとボタンが含まれています。ボタンは AsyncPostbackTriggers として登録され、CauseValidation="false" としてマークされ、ページの他の部分のバリデーターが起動されないようにします。UpdatePanel を以下に示します。
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ListSelectionControl.ascx.cs" Inherits="ListSelectionControl" %>
<div>
<asp:UpdatePanel ID="udpListSelection" UpdateMode="Conditional" runat="server" ChildrenAsTriggers="false">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btnRemove" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btnAddAll" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btnRemoveAll" EventName="Click" />
</Triggers>
<ContentTemplate>
<div>
<asp:ListBox ID="lstAvailableItems" runat="server" SelectionMode="Multiple" Rows="15" />
</div>
<div>
<asp:Button ID="btnAdd" CausesValidation="false" runat="server" OnClick="AddItems" Text="Add >" />
<asp:Button ID="btnRemove" CausesValidation="false" runat="server" OnClick="RemoveItems" Text="< Remove" />
<asp:Button ID="btnAddAll" CausesValidation="false" runat="server" OnClick="AddAllItems" Text="Add All >" />
<asp:Button ID="btnRemoveAll" CausesValidation="false" runat="server" OnClick="RemoveAllItems" Text="< Remove All" />
</div>
<div>
<asp:ListBox ID="lstSelectedItems" runat="server" SelectionMode="Multiple" Rows="15" />
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
ボタンの背後にあるコードは、リスト ボックス間のデータ交換を管理するだけであり、ここでは関係ないと思います。
私が抱えている問題は、部分的なポストバックが発生したとき (マスター ページのコードにブレークポイントを設定し、IsInAsyncPostback プロパティを分析すると、それが部分的なポストバックであると判断されます)、ページがインライン ASP サーバー コードを処理していて、CurrentClient オブジェクトが原因で失敗することです。再設定されていません。なぜこれが起こっているのか、なぜ部分的なポストバックが期待どおりに UpdatePanel を更新しないのかを理解しようとしています。
ご協力いただきありがとうございます。
リチャード