如果你不是在做动态加载控件那么你需要注意是不是使用Page.Controls.Remove之类的

症状:

页面中作用到ItemDataBound事情,对那些不满足情况的控制不给予显示。于是我就产生这么一段代码:

e.Item.Controls.Remove(e.Item.FindControl("btnDelete"));

异常:

未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配。

原因:

来自MSDN的一段介绍,“ViewState 为 ASP.NET 开发人员解决了一个特定问题 — 保留服务器端不形成元素的控件的状态。”,不然看出Remove移除数个控件后,当我下一次POST时不能在相同的控件,于是就产生该异常。

解决:

将控件隐藏而非移除。

(e.Item.FindControl("btnDelete") as LinkButton).Visible = false;

细节决定一切。这里还一篇讲述关于另外一些情况引起该异常的文章。