1

部分的なポストバックを使用して 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 を更新しないのかを理解しようとしています。

ご協力いただきありがとうございます。

リチャード

4

1 に答える 1