我目前有一个静态下拉列表,其项目从页面加载的数据库中绑定。基于此下拉列表中的选择,我在 ID 为“CustomControl1”、“CustomControl2”等的表中动态生成一组控件。我需要做的是下拉列表中的每个选择都有一个不同控件类型的唯一控件集,但它们都具有相同的 ID(基于它们生成的顺序)。因此,当我尝试生成一组新控件时,我收到此错误:
无法加载视图状态。正在加载视图状态的控制树必须与在先前请求期间用于保存视图状态的控制树匹配。例如,当动态添加控件时,回发期间添加的控件必须与初始请求期间添加的控件的类型和位置相匹配。
因此,在页面加载中,我有两种方法,一种基于 xml 生成控件,另一种创建验证控件,如下所示:
if (xml != "" && externalProperties.Rows.Count == 0)
{
LoadExternalProperties(xml);
ValidateExternalProperties(xml);
}
当我进行初始选择时,我能够正确生成控件,当我进行辅助选择时,无法生成控件,因为不同控件类型的视图状态不匹配。
所以我假设我需要做的是清除视图状态。我尝试了以下方法:
将视图状态设置为 null(在 Page_Init 和 In 之外尝试):
ViewState["CustomControl1"] = null;
清除表的行:
externalProperties.Rows.Clear();
清除控件表:
externalProperties.Controls.Clear();
在加载控件之前和之后切换 EnableViewState:
externalProperties.EnableViewState = false;
LoadExternalProperties(xml);
externalProperties.EnableViewState = true;
- 我只需要在下拉列表的选定索引更改时清除视图状态。这是因为在接下来的步骤中(使用向导),我正在检索这些值并将它们用于其他目的。
我目前正在跟踪先前选择的索引,以确定何时必须清除视图状态。