如何忽略先前特定控件请求的viewstate?

时间:2010-06-17 17:18:51

标签: c# asp.net viewstate

我正在动态生成控件,有时我想创建一个控件并让它忽略viewstate。例如,有时用户点击了一个按钮,指示他们想要加载不同的表单,因此我在回发时生成的控件树与原始控件树不同。这很好,除非我调用Controls.Add然后它尝试将旧控件的viewstate形式加载到新控件中,如果控件树结构相似,我希望他们改为忽略该viewstate(并且还忽略回发值)对于输入控件也是如此)。

我可以执行某些操作,例如设置控件的ID或允许我有条件地阻止它们获取上一个请求的viewstate / postback数据的内容吗?

编辑:如果我让控件的用户在回发处理程序中按需加载表单,当我调用Controls.Add时,不会应用回发数据(这看起来像是ASP.NET中的一个缺陷,因为我会认为如果您要通过Controls.Add“事后”应用视图状态数据,那么在加载视图状态数据后,您似乎也会自动应用回发数据。我遇到的真正问题是我的控制是非常动态的,但我的控件的用户在他们的回发处理程序触发之前无法真正告诉它该做什么,因为用户可以做的事情之一是选择不同的表单通过一些链接按钮加载。所以直到回发处理程序运行它们才知道uesr请求的内容,因此可以让我的控件加载某个表单。因此,我必须要求他们做一些有价值的事情,例如保存标识最后一个表单的formID到会话变量,在OnInit中,他们通过属性告诉我的表单旧的formID是什么。我的控件然后在OnLoad中加载表单,以便它可以使用视图状态和回发数据,稍后在程序员的回发处理程序中,他们可以选择清除表单并在需要时加载另一个表单。

Edit2:FYI为表单独有的每个控件生成ID很有用,所以我想我可以消除旧表单的无意义加载,直到程序员请求在其回发处理程序中加载表单。但正如我上面提到的,我发现在回发数据处理发生后加载表单意味着数据丢失。而viewstate通过Contorls.Add加载,在页面生命周期中追赶,似乎回发数据没有!所以我似乎每时每刻都被打败了。

4 个答案:

答案 0 :(得分:3)

如果您与控制生命周期一起玩,那么您将避免出现问题。基本上,每当你有一个渲染的控件时,最好确保在下一个回发时重新创建控件,即使你不再需要它。回发的第一个目标应该是恢复以前的状态 - 只有你对它进行更改。

我在这个答案中描述得最好:

Wrong state in Server Controls with same ID's when dynamically adding UserControl to UpdatePanel

答案 1 :(得分:2)

为控件提供不同的ID肯定会阻止ViewState被加载,这将是一种方式。

您也可以通过将其设置为“已禁用”来操纵控件的ViewStateMode属性。我不确定这是否会阻止它加载(它肯定会阻止它们保存视图状态),但你可以尝试一下。

答案 2 :(得分:1)

您是否尝试过在添加新控件之前调用controls.clear?

<强>更新

我开始相信您在页面生命周期中的错误点生成控件。你的流程是什么?

答案 3 :(得分:1)

您必须在pageload中为回发生成动态控件:

    protected void Page_Load(object sender, EventArgs e)
    {
      --Generate Dynamic Controls--
    }

你需要这样做:

    protected override void OnInitComplete(EventArgs e)
    {
        base.OnInitComplete(e);
    }

    protected void OnInit()
    {
     --Generate Dynamic Controls--
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }