在PostBack期间,从WebForms页面删除的控件返回!怎么预防?

时间:2015-01-11 07:59:15

标签: c# asp.net webforms

我对大多数人都有相反的问题。在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!

1 个答案:

答案 0 :(得分:0)

使用

controlID.Visible = false; 
而不是在回发中隐藏控件。

只要您不对每个回发的控件进行数据绑定,就不应该使用此方法阻止性能,因为使用此方法不会在页面上呈现控件的HTML。