【问题标题】:How to determine which control causes the ViewState loading to fail?如何确定是哪个控件导致 ViewState 加载失败?
【发布时间】:2013-04-10 09:47:06
【问题描述】:

我的页面面临 Viewstate 加载问题。

页面有一个登录工具来登录管理员和非管理员用户。当非管理员用户登录页面并单击启用了自动回发的复选框时,会发生奇怪的行为。 (错误详情如下)

后来我发现,在左侧的导航面板中(承载链接)

侧边栏如下图所示

Security
---------
Link1
Link2
Link3

Configuration
---------
Link1
Link2

如果“配置”部分下出现的内容不止于此,则会引发此异常。根据用户对 Page_Load 的权限动态删除链接(从完整列表中)。

如何追踪此类问题?我在 Visual Studio 中启用了所有异常,但查看哪个控件导致此问题并没有中断?

加载视图状态失败。视图状态所在的控制树 正在加载的必须与用于保存的控制树匹配 上一个请求期间的视图状态。例如,当添加 动态控制,回发期间添加的控件必须匹配 在初始阶段添加的控件的类型和位置 请求。

[HttpException (0x80004005): Failed to load viewstate.  The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request.  For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.]
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +380
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +214
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +214
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +214
   System.Web.UI.Page.LoadAllState() +464
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1729

【问题讨论】:

  • 您可以尝试仅在控件上设置Visible = false,而不是删除?这样视图状态信息是完整的,但不会显示控件。

标签: c# asp.net web


【解决方案1】:

如果您查看此article 中的页面循环,您可以看到视图状态在页面加载之前加载并在渲染之前保存。您正在删除视图状态加载之后的页面加载中的控件,这意味着在回发时,视图状态中的数据比页面预期的要少。尝试删除 prerender 中的控件,这应该在保存视图状态后发生,这应该可以解决您的问题。

詹姆斯:-)

【讨论】:

  • 你的意思是说我应该用 Page_Init 来做这个?我没有添加任何新控件,而是删除。
  • 您需要做的是确保 ViewState 和控件匹配 - 只要您加载了控件并且 loadviewstate 阶段中的视图状态匹配,但是您选择这样做,应该可以解决您的问题问题。
  • 实际上我正在使用第三方库进行控件。现在不知道是什么真正导致了这个问题。我观察到的行为是,某些部分超过两个会导致这种情况。我知道这很抽象,但仍然不知道如何调试它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2013-07-07
  • 2012-05-01
相关资源
最近更新 更多