动态控件更改后“无法加载 ViewState”

Posted

技术标签:

【中文标题】动态控件更改后“无法加载 ViewState”【英文标题】:"Cannot load ViewState" after dynamic control changed 【发布时间】:2010-04-28 15:22:56 【问题描述】:

在我的 ASP.NET 页面中,我必须根据下拉列表中的选定值动态选择和加载自定义控件。但是我遇到了以下问题: 当动态加载控件的参数发生更改,然后下拉列表中的选择发生更改(从而迫使我在下次页面重新加载时加载不同的动态控件),最终出现“无法加载 ViewState”异常。我假设发生这种情况是因为 ViewState 正在尝试恢复旧控件的参数但它没有找到它。 那么,有什么方法可以阻止视图状态尝试恢复不存在控件的状态?

【问题讨论】:

【参考方案1】:

您应该最初以完全相同的方式加载控件,然后在 LoadViewState 之后更改,或者禁用您知道不会与页面同步的动态控件的视图状态。

【讨论】:

【参考方案2】:

听起来下拉/添加的控件的状态在您恢复视图状态之前没有恢复。如果您将下拉菜单默认为显示控件 X,并且用户将其更改为显示控件 Y,则页面必须在视图状态恢复之前将控件 Y 添加到控件集合中。

【讨论】:

这正是我正在做的事情,我相信这就是导致问题的原因:在恢复视图状态之前添加了控件 Y,但没有添加控件 X,因为不再需要它。但是, viewstate 尝试恢复控件 X 的状态,但没有找到该控件 Hrm,那是一个棘手的问题。如果没有看到完整的代码并尝试运行一些修补生命周期的测试运行,就很难推测。您是否尝试过只保留 X,然后在视图状态恢复后将其移除? 好吧,我想这就是我最终要做的事情,但这是一个丑陋的解决方案:你不能只在其中留下动态控件,因为它必须在每次回发时重新加载。我'd 本质上是在加载一个新控件,只是在之后将其删除:S【参考方案3】:

同样的问题是,可变长度的控件列表由用户添加、重新排列和/或修改,并且在每次回发期间都可以更改。

答案非常简单。

当您创建动态控件集“EnableViewState = False之前将其添加到页面控件集合中。然后不会存储任何视图状态信息,并且无论添加、删除或重新排序多少动态控件,其他所有内容的视图状态都将正常工作。

如果您动态添加这些,您通常会设置所有属性,因此在我的情况下它实际上并没有创建任何工作,这非常相似。

【讨论】:

刚刚意识到这是 Glennular 回答的,但他留下的文字不是很清楚,所以我将把它留给其他人。【参考方案4】:

我对网格控制有同样的问题。我正在动态绑定数据视图,根据 DarrenMB 的解决方案,我刚刚写了 EnableViewState = false;问题解决了。

Infragistics.Web.UI.DataSourceControls.DataView dvMesaj = new Infragistics.Web.UI.DataSourceControls.DataView();


        whdsShowMessages.DataRelations.Clear();
        whdsShowMessages.DataViews.Clear();
        whgridShowMessages.Rows.Clear();
        EnableViewState = false; //here is the solution..
        whdsShowMessages.DataViews.Add(dvKisi);
        whdsShowMessages.DataViews.Add(dvMesaj);

【讨论】:

以上是关于动态控件更改后“无法加载 ViewState”的主要内容,如果未能解决你的问题,请参考以下文章

动态创建的 asp.net 控件在回发后消失

Winform中实现更改DevExpress的RadioGroup的选项时更改其他控件(TextEditColorPickEdit)的值

WPF动态克隆和控件的属性更改

在 XsltForms 控件中动态更改值

带有 ngmodel 的 Angular 2 动态表单示例导致“表达式在检查后已更改”

如何动态更改列表中控件的属性(C# Winform)?