17

在 UserControl 内托管的 ASP.NET 表单上进行 HTTP POST 后,我收到以下错误消息:

无法加载视图状态。正在加载视图状态的控制树必须与在先前请求期间用于保存视图状态的控制树匹配。例如,当动态添加控件时,回发期间添加的控件必须与初始请求期间添加的控件的类型和位置相匹配。

这是附加信息:

  • 我正在运行 .NET 4.5 RC
  • 这是一个基于 Umbraco 4.7 的网站
  • 在我的本地开发机器上,表单完美运行
  • 此错误仅发生在具有 .NET 4.5(仅)、MSSQL 2012 Express、IIS 7.5、Windows 7 的登台服务器上(我知道,它还不是真正的服务器,也许有一天......)
  • 服务器不是网络农场(或花园,但应该无关紧要)的一部分
  • 用户控件确实动态呈现控件

我已经应用了所有最新的服务包。我现在已经没有想法了!我什至重新启动了它,并在服务器上进行了一场涉及歌曲和特殊舞蹈的丰富表演,但无济于事。

4

12 回答 12

26

当您动态添加控件时,重要的是要添加它们的事件。

如果您在加载后发生的事件上添加了控件,它们将成为您发送给客户端的视图状态的一部分。

LoadViewState在调用之前,您必须再次添加这些控件。

如果您遇到添加哪些控件的决定本身存储在控件ViewState的值或控件的值中的情况,那么请记住,即使在ViewState加载之前,此数据在Request.Params

参考asp.net页面生命周期

页面生命周期

于 2012-08-03T12:52:18.870 回答
21

我刚刚添加EnableViewState="false"到我的页面占位符并且它消失了。希望它也适用于你。

于 2013-04-17T06:02:21.613 回答
4

此错误主要发生在视图状态更改期间:从一个模板到另一个模板,例如在 ASP .net(所有框架)中的表单视图、列表视图、详细视图、网格视图等控件中的项目模板、编辑项目模板;

虽然从控制状态更改说 Item Template ---> Edit Template 以下内容将要改变

1) 控件会改变(它的 ID 和状态)

2) 它的位置会改变。

如果发生任何回发,则转换视图时,您将收到错误消息

无法加载视图状态。正在加载视图状态的控制树....

如果您使用单独的控件进行数据绑定,例如 (button,link_button_Image_button 事件),您将收到此错误报告!

为避免此错误 >>>一旦状态从一个模板更改为方法内的另一个模板,您将调用数据源绑定(不要在单击或任何后备事件期间调用)。

于 2014-03-15T07:21:15.767 回答
1

好的,所以答案就是字面意思:“使用与上一个相同的软件设置一个新服务器,然后重试”,它现在可以工作了。

于 2012-08-03T15:41:11.583 回答
1

我添加了与 id 具有相同值的“name”属性,然后这个问题就消失了。

<input type="button" id="extractBomInfoBtn" name="extractBomInfoBtn" value="Extract" class="button   textonly" />
于 2014-09-17T14:34:37.610 回答
1

我遇到过同样的问题。这个问题在客户端,但在我的本地系统中没有发生。经过数小时的谷歌搜索,我已将 EnableViewState="false" 写入包含所有动态控件的 aspx 页面中的表标记,然后我删除了所有 viewstate 变量,而是在 aspx 页面中创建了一些隐藏的文本框并将 DB 值接受到它们在代码后面并在我的代码中使用它们。然后它解决了我的问题。但是,我仍然无法弄清楚到底是什么问题。

于 2016-09-02T01:39:25.300 回答
1

在我的例子中,我在页面加载时操作了asp:Literal的.Text属性,这导致了问题。在所有其他情况下,这从未导致我出现视图状态错误,但在这种特殊情况下,我将.Text值更改为 html 元素。

以下导致错误:

<asp:Literal ID="SvgIcon" runat="server" />

SvgIcon.Text = "<svg version=\"1.1\" id=\"Layer_1\" bla bla />"

我能够通过将EnableViewState="false"显式添加到控件来解决错误:

<asp:Literal ID="SvgIcon" runat="server" EnableViewState="false" />
于 2019-04-10T21:01:13.780 回答
0

检查您是否在页面加载事件中直接具有控件的绑定方法。这可能会导致此问题。

于 2015-11-19T08:08:25.333 回答
0

您可以为每个 UserControls 添加新的 PlaceHolder

或者

enableviewstate=false如果不需要视图状态,可以在控件上设置

于 2016-01-18T12:17:21.440 回答
0

在我的情况下,我有一个带有 (OnPageIndexChanging) 事件的网格视图,当我点击一个页面时,除非我点击它两次,否则什么都不会发生!

在设置新页面索引之前,我正在刷新数据源。


这就是我做错了什么

grd.DataSource = data;
grd.DataBind();
grd.PageIndex = e.NewPageIndex;

这是正确的方法

grd.PageIndex = e.NewPageIndex;
grd.DataSource = data;
grd.DataBind();
于 2016-06-12T08:08:40.257 回答
0

如果您SaveViewState在控件中覆盖但不覆盖,则可能会发生这种情况LoadViewState

于 2016-10-05T12:18:22.557 回答
0

所以我实际上最终发现我绑定的实体列表与 ViewState 中的控件的顺序不同!我仍在通过更清洁的解决方案工作,但我的代码正在使用 ViewStateEnabled = true,方法是让重建我的动态控件(从 Page_Load 调用)的方法在 !IsPostBack 中以不同的方式执行。

最终,我可能需要为我的嵌套动态控件修复我的排序算法,但我只想说:如果您使用与我相同的模式,使用 List 生成/绑定到动态控件,并且该顺序是流动或变化,尝试比较 Request.Params 以找到与您的控制层次结构相关的键,并查看它们是否与您的列表的顺序匹配。这解决了我的问题。感谢@nunespascal!

简而言之,我在 AjaxToolkit 选项卡控件中动态生成除了一个选项卡之外的所有选项卡,然后用几层深占位符和常规控件(文本框、下拉列表等)填充它,这就是为什么获取所有内容的顺序很复杂正确的。

于 2021-01-14T08:35:46.353 回答