无法加载viewstate。正在加载viewstate的控制树

问题描述 投票:13回答:11

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

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

这是其他信息:

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

我已经应用了所有最新的服务包。我现在已经没想完了!我甚至已经开始了它并且还在服务器上进行了一场仪式,涉及一首歌和一种特殊的舞蹈无济于事。

asp.net .net umbraco .net-4.5 asp.net-4.5
11个回答
22
投票

在动态添加控件时,重要的是添加控件的事件。

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

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

如果您遇到决定添加哪个控件本身存储在ViewState或控件值中的情况,那么记住甚至在加载ViewState之前,这个数据可以在Request.Params中找到

请参阅asp.net page life cycle


0
投票

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


0
投票

在我的情况下,我正在操作页面加载的asp:Literal的.Text属性,这导致了问题。在所有其他情况下,这从未导致我出现viewstate错误,但在这种特殊情况下,我将.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" />

21
投票

我刚刚将EnableViewState="false"添加到我的页面占位符中,它就消失了。希望它对你也有用。


4
投票

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

虽然从控制状态转变为Item Template ---> Edit Template,但以下情况将会发生变化

1)控制将改变(其ID和状态)

2)它的立场会改变。

在转换视图时,如果发生任何回发,您将获得错误

无法加载viewstate。正在加载viewstate的控制树....

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

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


1
投票

好的,所以答案是字面意思:“设置一个新服务器,其中包含与最后一个软件相同的软件,然后再试一次”,现在可以正常工作。


0
投票

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

<input type="button" id="extractBomInfoBtn" name="extractBomInfoBtn" value="Extract" class="button   textonly" />

0
投票

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


0
投票

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

要么

如果你不需要viewstate,你可以在控件上设置enableviewstate=false


0
投票

在我的情况下,我有一个带有(OnPageIndexChanging)事件的网格视图,当我点击页面时,在我点击两次之前不会发生任何事情!

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


这就是我做错了

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

这是正确的方法

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.