在面板内回发后,转发器的状态不会持续存在

时间:2012-05-10 10:48:04

标签: asp.net user-controls postback repeater viewstate

我在标记中有以下代码结构:

        <asp:Panel ID="Panel1" runat="server" Title="TestPanel" Visible="true">
          <asp:GridView ID="grd1" runat="server" AutoGenerateColumns="true">        
          </asp:GridView>
          <myControl:RepeaterUserControl ID="rpt"></myControl:RepeaterUserControl>
        </asp:Panel>

该面板用于控制可见性(目前始终设置为true)。控件'RepeaterUserControl'是一个用户控件,它包含一个asp转发器,带有两个名为'Ok'和'Cancel'的按钮(所有初始设置显示:无)。所有这些用户控件的内容在页面上显示为模式弹出窗口(使用模式弹出扩展器),单击“调用”按钮,该按钮也是用户控件的一部分。

<div id="div1" runat="server">
    <ajax:ModalPopupExtender ID="ModalPopupExtender1" runat="server" PopupControlID="divDialog"
        TargetControlID="btnDummyInvoker" CancelControlID="imbClose" PopupDragHandleControlID="divDialogTitle"
        BackgroundCssClass="modalBackground">
    </ajax:ModalPopupExtender>
    <div style="height: 4px;">
    </div>
    <asp:Button ID="btnInvoke" runat="server" OnClick="btnInvoke_Click" Text="Invoke"
        Width="90px" />
    <div style="display: none; position: absolute;">
        <asp:Button ID="Button2" runat="server" />
    </div>
    <div id="div2" runat="server" style="display: none;">
        <asp:Repeater ID="rptList" runat="server">
            <ItemTemplate>
                <tr>
                    <td>
                        <asp:Label ID="lblName" runat="server" Text='<%# Eval("DisplayText").ToString() %>'></asp:Label>
                    </td>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
        <asp:Button ID="btnOk" runat="server" OnClick="btnOk_Click" />
        <asp:Button ID="btnCancel" runat="server" />
    </div>
</div>

因此,在网格下方,用户在页面上看到一个按钮(Invoke),点击其中的转发器控件和Ok / Cancel按钮显示在模态弹出窗口中。转发器被分配一个数据源,其中包含项目列表,用户进行更改以及弹出窗口的ok单击,从后面的代码(ok OnClick事件)我访问转发器作为rptList.Items.Count进行进一步的操作。

现在问题。 如果用户控件在面板之外,则它会完美地返回正确的项目数,但如果面板内的userControl(如代码所示),则在回发后单击ok按钮返回的计数为“0”。 为什么转发器会在这种情况下失去其状态?

更新:从代码隐藏中添加代码段,如果它有助于解决问题

//This is from the user control code
 protected void btnInvoke_Click(object sender, EventArgs e)
        {   
          rptList.DataSource = listToBeBoundToRepeater;
          rptList.DataBind();
          modalPopupExtender.Show();             
        }

//This is from the user control code
 protected void btnOk_Click(object sender, EventArgs e)
        {

            for (int itemIndex = 0; itemIndex < rptList.Items.Count; itemIndex++)
            {
               // business logiv
            }

        }
对于我所描述的案例的回发,rptList.Items.Count对我来说是0。

update2: 这是我得到的奇怪的解决方案,我将网格和转发器用标签包围,并将runat属性设置为服务器以使其成为服务器控件。现在它在回发后坚持转发器的价值。奇怪,但现在正在工作。

3 个答案:

答案 0 :(得分:1)

这是我得到的奇怪解决方案,我将网格和转发器用标签包围,并将runat属性设置为服务器以使其成为服务器控件。现在它在回发后坚持转发器的价值。奇怪,但现在正在工作。

答案 1 :(得分:0)

for <asp:UpdatePanel ID="UpdatePanel1" runat="server">,将AsyncPostbackTrigger定义为btnInvoke

答案 2 :(得分:0)

编辑:删除了上一个答案。
我尝试使用包含usercontrol的主面板尽可能模拟您的问题,该控件包含一个与ajaxcontroltoolkit一起显示的转发器。 虽然我的转发器项目数总是正确的。
容器页面:

<%@ Register TagPrefix="a" TagName="test" Src="cc.ascx" %>

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:ScriptManager ID="ScriptManager1" runat="server" />   
    <asp:Panel ID="Panel1" runat="server" Title="TestPanel" Visible="true">
        <a:test runat="server" ID="test"></a:test>
    </asp:Panel>
</asp:Content>

用户控制cc aspx:

<%@ Register TagPrefix="ajax" Namespace="AjaxControlToolkit" Assembly="AjaxControlToolkit, Version=4.1.60501.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" %>

<div id="div1" runat="server">
    <ajax:ModalPopupExtender ID="ModalPopupExtender1" runat="server" PopupControlID="divDialog"
        TargetControlID="btnDummyInvoker"
        BackgroundCssClass="modalBackground">
    </ajax:ModalPopupExtender>
    <asp:Button runat="server" style="display:none" ID="btnDummyInvoker"/>
    <div style="height: 4px;">
    </div>
    <asp:Button ID="btnInvoke" runat="server" OnClick="btnInvoke_Click" Text="Invoke" Width="90px" />
    <div style="display: none; position: absolute;">
        <asp:Button ID="Button2" runat="server" />
    </div>
    <div id="divDialog" runat="server" style="display: none;">
        <asp:Repeater ID="rptList" runat="server">
            <ItemTemplate>
                <tr>
                    <td>
                        <asp:Label ID="lblName" runat="server" Text='<%# Eval("DisplayText").ToString() %>'></asp:Label>
                    </td>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
        <asp:Button ID="btnOk" runat="server" OnClick="btnOk_Click" />
        <asp:Button ID="btnCancel" runat="server" />
    </div>
    <asp:TextBox runat="server" ID="result"></asp:TextBox>
</div>

后面的用户控制代码:

public partial class cc : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnInvoke_Click(object sender, EventArgs e)
        {
            var list = new List<Data>();
            list.Add(new Data { DisplayText = "one" });
            list.Add(new Data { DisplayText = "two" });
            rptList.DataSource = list;
            rptList.DataBind();
            ModalPopupExtender1.Show();
        }

        protected void btnOk_Click(object sender, EventArgs e)
        {
            var count = rptList.Items.Count;
            result.Text = count.ToString();
        }
    }