为什么ASP.NET ViewState保留了asp:dropdownlist而不是asp:table?

时间:2011-01-10 00:02:05

标签: asp.net dynamic viewstate

好吧,对于你们中的许多人来说,这个问题可能有一个非常明显的答案,但它让我很难过。

我有一个asp.net网页表单,在其上我有两个控件(好吧,这两个以上但我们会关注这些) - 第一个是 asp:dropdownlist 和第二个是 asp:table

这两个控件都在HTML端声明,并在代码隐藏页面中填充(添加了子控件)。

我的简单问题(希望通过一个简单的答案)是:

为什么viewstate会持续显示下拉列表,而不是表格?

我必须在每个页面加载时填写表格,但我可以填写下拉列表一次(使用Not Page.IsPostBack),并且它仍然存在。

注意:我已经阅读过有关ASP.NET页面生命周期的内容,并且我尝试将这些相同的调用放在Init()和PreInit()页面事件中,但结果相同。

我在这里错过了哪些明显的细节?

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

你没有遗漏任何东西,你的评估是正确的。 ASP.NET表不会将其内容保存为查看状态。

我假设至少部分原因是一个表可以包含任意数量的任何类型的数据,并且在某些情况下可能真的开始添加到视图状态的大小。

无论哪种方式,这都是他们的工作方式。如果页面上有回发,则需要在每个加载事件上重新填充表,或者将表数据存储到自己查看状态,然后从数据中重新填充表。

答案 1 :(得分:3)

asp:table对象不会将其内容存储在ViewState中,因为它不是数据绑定控件。它在这方面的作用与asp:panel相同;如果以编程方式向其添加控件,则需要在每个回发时执行此操作,否则其中的项目将不会持续存在。

答案 2 :(得分:0)

如果你想在viewstate中存储表的内容 - 我不推荐,但有时你需要这样做......你只需要使用标准的asp.net表控件。

<asp:Table ID="Table1" runat="server">
    <asp:TableRow ID="TableRow1" runat="server">
        <asp:TableCell ID="TableCell1" runat="server">
        This is Cell 1
        </asp:TableCell>
        <asp:TableCell ID="TableCell2" runat="server">
        This is Cell 2
        </asp:TableCell>
    </asp:TableRow>
</asp:Table>

您可以在http://weblogs.asp.net/nannettethacker/archive/2008/01/24/html-tables-to-asp-net-table-controls.aspx了解更多操作方法。

您也可以尝试将runat="server"添加到table代码。

并没有直接回答你的问题,但认为它可能会有所帮助。