【问题标题】:Failed to load viewstate?无法加载视图状态?
【发布时间】:2012-08-10 12:43:56
【问题描述】:

加载视图状态失败。正在加载视图状态的控件树必须与之前请求期间用于保存视图状态的控件树匹配。

页面加载正常,直到我在页面上包含一个 asp 面板。然后我看到了上面的错误。

谁能想到可能的原因? asp 面板是空的,我刚刚创建了一个测试:

<asp:Panel runat="server" ID="pnlTest"></asp:Panel>

它坏了。

【问题讨论】:

  • 你什么时候“包括”面板?
  • 不确定我理解您所说的“何时”是什么意思?如果您的意思是定义的时间/地点 - 在 aspx 页面的标记上。
  • 对不起,我的印象是它是以某种方式动态添加的。如果您已将页面加载到浏览器中,则 Viewstate 将无法正确加载,然后将控件添加到 aspx 页面中,然后在浏览器中发回服务器...这是因为 ASPX 中的控件不再是与创建初始页面时相同 - 这是您在做什么?
  • 是的,你说得对 - 对于我所做的所有相关阅读 - 我可以看到情况就是这样。但不,这不是动态添加的。它只是在页面标记上。奇怪的是,当面板不存在时它加载正常。
  • 呃,不知道我理解为什么你要这样做? ASP.NET 需要 ASPX 标记在回发中与在初始页面请求中相同。

标签: c# asp.net controls viewstate


【解决方案1】:

你需要用&lt;/asp:Panel&gt;关闭面板

<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

【讨论】:

  • 我很抱歉,这只是出于讨论目的(懒惰地)写在 OP 中(以显示面板没有内容),我确实正确关闭了它 - 我已经编辑了 OP。 +1。
【解决方案2】:

你遇到的问题是你在过程中途改变了事情......

当您从 ASP.NET 请求页面时,它会使用 .aspx.ascx 文件中的标记。由此(以及许多其他内容,包括您在代码隐藏中创建的任何动态控件),它会创建 ViewState,该 ViewState 存储在您的页面中名为 __VIEWSTATE 的隐藏字段中。

当您随后将页面回发到服务器(通过链接或单击按钮等)时,服务器将加载该 ViewState 信息,并期望 @ 中的所有控件987654324@ 和 .ascx 文件处于完全相同的状态。

据我从你们的 cmets 那里得知,你们正在做的是……

  • 从服务器请求页面(正在加载 HTML,包括__VIEWSTATE
  • 更改服务器上的.aspx 页面(在这种情况下添加新的&lt;asp:Panel&gt;
  • 将页面发布回服务器并收到错误。

在这第三阶段,服务器正在查看.aspx 中的控件并查看__VIEWSTATE 中的信息...错误是因为控件不匹配! 服务器不希望在页面中看到&lt;asp:Panel&gt;,因为__VIEWSTATE 没有提及它。


所以解决问题的方法很简单 - 只需将控件添加到 .aspx 将页面加载到浏览器中

【讨论】:

  • 非常感谢您提供如此全面的答案,但忘记了我正在向页面添加一个 asp 面板的事实。该页面不适用于其中的 asp 面板。在设计时,我正在添加 asp 面板。在运行时它不起作用。这不是以任何方式动态添加的。
  • 在那种情况下@DeeMac,我不明白发生了什么......如果面板在您最初请求页面时就在那里,并且当您发布时.aspx 中没有任何变化 -返回,那么视图状态必须有其他变化才能变为无效。
  • 奇怪是不是。我假设,根据视图状态的定义,当没有面板存在时,它不记得页面的先前标记 - 所以我不知道它将它与“什么视图状态”进行比较。
  • 对不起@Dee,但你似乎又在自相矛盾了......你是什么意思“没有面板时的先前标记”?您听起来好像视图状态是基于没有面板的页面创建的,然后在回发时加载到面板的页面
  • @Dee,为了解决一个愚蠢的问题,请确认您没有使用“预构建”的 HTML 片段重新发回服务器 - 从以前版本的 HTML 中获取的内容现在与更新的页面一起发送到服务器?
【解决方案3】:

为了抑制这个错误(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; }
        }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多