无法加载视图状态。正在加载视图状态的控制树必须与在先前请求期间用于保存视图状态的控制树匹配。
页面加载正常,直到我在页面上包含一个 asp 面板。然后我看到上面的错误。
谁能想到可能的原因?asp 面板是空的,我刚刚创建了一个测试:
<asp:Panel runat="server" ID="pnlTest"></asp:Panel>
它打破了。
您需要关闭面板</asp:Panel>
<asp:Panel runat="server" ID="pnlTest">
</asp:Panel>
在页面初始化时创建动态控件
更多信息 http://geekswithblogs.net/FrostRed/archive/2007/02/17/106547.aspx
这里还有更多信息 http://blog.typps.com/2008/01/failed-to-load-viewstate-typical.html
您遇到的问题取决于您在过程中途改变事物......
当您从 ASP.NET 请求页面时,它使用.aspx
和.ascx
文件中的标记。由此(以及许多其他内容,包括您在代码隐藏中创建的任何动态控件),它创建了 ViewState,该 ViewState 存储在您的页面中名为__VIEWSTATE
.
当您随后将页面回发到服务器时(通过链接或单击按钮等),服务器将加载该 ViewState 信息,并期望.aspx
和.ascx
文件中的所有控件处于完全相同的状态。
从您的评论中我可以看出,您正在做的是......
__VIEWSTATE
).aspx
服务器上的页面(在这种情况下添加一个新的<asp:Panel>
)在这第三阶段,服务器正在查看中的控件.aspx
并查看中的信息__VIEWSTATE
......错误是因为控件不匹配!服务器不希望<asp:Panel>
在页面中看到 an,因为__VIEWSTATE
没有提及它。
所以解决您的问题的方法很简单 - 只需在将页面加载到浏览器.aspx
之前将控件添加到
为了抑制这个错误(ViewState 将被部分加载):
public partial class MyClass: System.Web.UI.Page
{
bool StateFail;
protected override object LoadPageStateFromPersistenceMedium() {
if (StateFail) return null;
return base.LoadPageStateFromPersistenceMedium();
}
protected override void OnInitComplete(EventArgs e) {
base.OnInitComplete(e);
if (!IsPostBack) return;
try
{
typeof(System.Web.UI.Page).GetMethod("LoadAllState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(this, new object[0]);
} catch { StateFail = true; }
}
}
}