尽管控制不在IsPostBack检查中,但PostBack仍会丢失数据

时间:2019-06-28 14:48:54

标签: c# session-variables postback

HTML

<div class="row">
    <div class="col-xs-2">
        <asp:Panel runat="server" ID="pnlContainer">
            <asp:Table runat="server" ID="tblMyTable" ClientIDMode="Static" CssClass="table table-condensed tale-bordered">
                <asp:TableHeaderRow>
                    <asp:TableHeaderCell ColumnSpan="2">
                        <h4>Header Words</h4>
                    </asp:TableHeaderCell>
                </asp:TableHeaderRow>
                **TableRows created dynamically and contain a Checkbox**
            </asp:Table>
        </asp:Panel>
    </div>
</div>
**Other HTML Markup**
<asp:Button runat="server" ID="btnClear" Text="Clear" OnClick="btnClear_Click" />

Page_Load

if (!IsPostBack)
{
    Build_Table();
    Session["Table"] = tblMyTable;
}
if (tblMyTable != null)
{
    pnlContainer.Controls.Remove(tblMyTable);
}
pnlContainer.Controls.Add((Table)Session["Table"]);

btnClear_Click

foreach (TableRow tableRow in tblMyTable.Rows)
{
    **more code**
}

尽管每个Page_Load上都加载了控件,但我有一个页面在其PostBack中丢失了数据。我有一个asp:Panel,其中有一个asp:Table。该表仅具有标题行,因为当Page_Load时,这些行是通过Build_Table()方法在!IsPostBack中动态构建的。 Build_Table()方法可以很好地创建Table。然后,将表存储在称为表的Session变量中。在!IsPostBack之外,我从面板控件中删除了Table,因为下一行ID会发生冲突(我知道要避免这种情况,我应该只在Build_Table()方法中创建整个Table)。然后,我将表广播的Session变量添加到面板中。到目前为止,一切正常。表格在页面上正确显示。

问题是,当我单击页面上的“清除”按钮时,代码将循环遍历表中的每一行,并取消选中每一行上的复选框。调试时说表只有1行(我在HTML标记上有静态标头行)。在btnClear_Click中,我甚至添加了Table test = (Table)Session["Table"];以确保Session变量正确,并按预期返回了整个表。

我一直在为PostBacks奋斗,所以我的问题是,如果确认Session [“ Table”]能够按预期保存整个Table,并且将该Session变量强制转换并添加到!IsPostBack之外的容器中,为什么那么Table是空的是btnClear_Click方法的第一行吗?

0 个答案:

没有答案