我对大多数人都有相反的问题。在ASP.NET WebForms页面上,在Page_Load中,我从UI中删除了一堆控件。所有这些删除的控件都包含在ASP.NET Panel控件中。使用(Panel.Controls.Clear()
)删除它们。页面上有一些回发机制,例如:按钮,自动调整下拉列表等。
问题是在回发时,删除的控件又回来了!我尝试为这些面板启用ViewState,禁用它。但他们只是回来了。
如何确保删除的控件保持删除状态?
PS:重新评估删除的要求是昂贵的,因为[1]有很多这样的控件,[2]所有这些都涉及到数据库后端。
编辑:添加代码以说明:
实际代码非常庞大和复杂,发布了一个缩写版本以便理解:
在Page_Load中:
if (! IsPostBack)
{
/// ... code to retrieve data & populate to existingItems
// if existingItems dropdownlist is empty, clear the panel and add notice message.
if (existingItems.Items.Count > 0) // existingItems is a dropdownlist
{
existingItemsContainerPanel.Controls.Clear();
existingItemsContainerPanel.Controls.Add(new LiteralControl("No items found!"));
}
}
当页面首次使用空数据集运行时,控件将被正确清除并设置通知消息。单击页面上的任何提交按钮时,从existingItemsContainerPanel面板清除的控件全部重新出现。当然,在回发时也缺少增加的文字控制。
根据@ Scotty的回答,我尝试将面板中的所有控件设置为Visible = false
,但这也有同样的问题。控件在回发时可见。
观察:从Control.LoadViewState的参考源(请参阅:http://referencesource.microsoft.com/#System.Web/UI/Control.cs,d09938bb5b5567f5)中,如果单击调用方法的位置,则Panel控件在回发时调用LoadViewStateRecursive不会出现。只有在内部控件集合似乎被修改时才会调用它。所以可能这应该被写为.net框架功能/ bug并留给开发人员实现他们自己的方式来管理viewstate!
答案 0 :(得分:0)
使用
controlID.Visible = false;
而不是在回发中隐藏控件。
只要您不对每个回发的控件进行数据绑定,就不应该使用此方法阻止性能,因为使用此方法不会在页面上呈现控件的HTML。