【发布时间】:2011-10-04 15:57:53
【问题描述】:
示例 1:
<asp:Panel Visible="false" runat="server">
<asp:TextBox ID="textbox" runat="server" />
</asp:Panel>
这里,textbox.Visible 在代码中返回 false(即使 TextBox.Visible 没有明确设置;它似乎从其不可见的父级“继承”了该属性)。
示例 2:
<asp:DataGrid ID="grid" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateColumn Visible="False">
<ItemTemplate>
<asp:TextBox ID="textbox" runat="server" />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
...
</asp:DataGrid>
这里,((TextBox)grid.Items[0].FindControl("textbox")).Visible 返回true(假设 DataGrid 至少有一行)。
问题:这种不一致的行为是设计使然吗?在这两种情况下,TextBox 都不会呈现,因为某些父元素是不可见的。
(当然,在第二种情况下,文本框位于模板内,但我不是在模板定义中查询抽象文本框,而是在行号 0 中查询特定的具体文本框。)
背景: TextBox 是一个智能控件:It only saves its Text property in the ViewState if it's invisible. 这是有道理的:如果 TextBox 可见,则将其呈现为 HTML <input> 控件,并且其当前 Text 值提交于回发 - 无需通过 ViewState 再次提交。当然,如果 TextBox 不可见,则不会呈现它,因此,对 Text 属性的任何更改都会丢失。
现在,示例 2 给我们带来了一些麻烦。 textbox 认为它正在被渲染(根据 IL spy,它在 TextBox.SaveTextViewState 中检查自己的 Visible 属性),因此它不使用 ViewState 并且在代码中对 textbox.Text 所做的所有更改都将丢失。我现在想知道这是否是错误。
相关问题: How to get the set/real value of the Visible property in Asp.Net.
编辑:我已经为此创建了 Microsoft Connect 错误报告:
【问题讨论】:
标签: asp.net datagrid textbox viewstate