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

时间:2012-08-03 12:44:27

标签: asp.net .net umbraco .net-4.5 asp.net-4.5

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

  

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

以下是其他信息:

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

我已经应用了所有最新的服务包。 我现在已经没想完了!我甚至重新启动它,并且还在服务器上执行了一个涉及歌曲和特殊舞蹈的富人无济于事。

12 个答案:

答案 0 :(得分:22)

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

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

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

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

参考asp.net page life cycle

Page life cycle

答案 1 :(得分:21)

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

答案 2 :(得分:4)

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

从控件状态更改时说Item Template ---> Edit Template 以下情况将会改变

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

2)它的位置会改变。

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

  

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

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

为避免此错误>>> 状态在方法中从一个模板更改为另一个模板时,您调用数据源绑定(在点击或任何后期支持事件期间不要调用)。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我添加"名称"属性与id具有相同的值,那么这个问题就消失了。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

OR

如果您不需要viewstate

,可以在控件上设置enableviewstate=false

答案 7 :(得分:0)

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

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

  

这就是我做错了

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

这是正确的方法

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

在我的情况下,我是在页面加载时操纵了 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" />

答案 11 :(得分:0)

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

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

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