最近参照codeproject做一个类似Google IG的个性化主页。基本上已经实现了所有的功能,但是现在有一个问题就是在一个窗口从一个panel拖到另一个panel后重新加载所有的窗口时会抛出
未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配。
的异常。
我自己也分析了原因,主要是因为第一次加载时是将被拖动的窗口加载到其中一个panel中的,拖动到其他panel后,在执行其他需要重新在家页面的操作时,这个窗口(一个用户控件)加载的容器不初次不一样了,所以抛这个异常。我试过如果把这个窗口的ViewState设为false,就不会抛上面的异常了。但我窗口中的其他控件也取不到回送前的值了。
各位大侠有什么比较好的解决方式吗?在回送后把动态加载的控件从一个容器移到另一个容器时也会遇到这个问题,你们是怎么解决的呀?或者有什么办法可以让容器的ViewState为false的情况下,这个容器内部包含的控件的ViewState却可以为true?
谢谢
------解决方案--------------------------------------------------------
其实webpart是asp.net2.0(vs2005)中一个现成的功能。
你的这个问题反映了对动态装载控件基本控制流程的误解。在页面回发之后,首先页面必须恢复上一次输出html之前最后的控件树布局,也就是panel拖动之前的布局。然后,在page_load执行完毕之后,在相关事件中捕获到panel被拖动了,此时删除原来的panel、产生新的panel并插入新的位置。
大概,你把后一个动作提前到page_load中或者之前去执行了。本来要两次创建Panel,而不是一次。
------解决方案--------------------------------------------------------
页面postback时,捕获panel的新位置必须是在page_load执行完毕之后的某个事件中,处理任何业务逻辑都应该在page_load结束之后的某个事件中,不应该在page_load中处理。从页面开始一直到page_load结束,其主要目的都是用来恢复页面上一次输出html时的控件布局,因为asp.net在page_load结束后立刻向在page_load中动态装载的控件填入ViewState、Post值。之后才能触发各种事件。以前我看到过很多示例小程序在page_load中就打算获取页面提交值来处理业务逻辑,这仅仅对一些只有几条示例代码、几乎没有交互操作、怎么胡写都没问题的几条代码逻辑的小例子适用。