viewstate用法(review的用法和搭配)

viewstate用法(review的用法和搭配)

未能加载视图状态(Failed to load ViewState),解决之道

  在动态加载页面(用户控件)的时候,我的项目是利用atlas的UpdatePanel加载用户空间到PlaceHolder中,很容易出现这个错误:

  Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

  Exception Details: System.Web.HttpException: 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.

  这个错误的原理如下:

  在页面回传,重新生成时,会自动装入回传前的视图状态。结合自己的实验,了解的这个过程大致如下:

  Init事件 -> ViewState加载 -> Load事件 -> 其它页面事件(如回传前的按钮点击)-> PreRender事件

  用户控件动态加载代码通常都位于Load事件中(比如我的BindData),或者位于atals的Triger空间EventHandler中,此时整个页面的ViewState已经加载,就又通过一个有人称做Catch-up的机制再向PlaceHolder中新加载的控件追加其ViewState,而这个ViewState为回传前在相应位置的控件的ViewState。所以如若新的控件与旧的类型控件不同的话,将出现前述错误。

  这个错误解决起来也很简单:

  在加载新的空间之前,先加载一下原来的控件,然后把PlaceHolder Clear掉,然后加载新的控件,至于如何保存原来的控件信息,当然也是使用一个ViewState Property, 比如我的代码中的ControlType了!

  viewstate用法(review的用法和搭配)
        
protected
 
string
 ControlType

  viewstate用法(review的用法和搭配)        

{

  viewstate用法(review的用法和搭配)            get

  viewstate用法(review的用法和搭配)            …{

  viewstate用法(review的用法和搭配)                if (ViewState["ControlType"] != null)

  viewstate用法(review的用法和搭配)                …{

  viewstate用法(review的用法和搭配)                    return ViewState["ControlType"].ToString();

  viewstate用法(review的用法和搭配)                }

  viewstate用法(review的用法和搭配)                return "";

  viewstate用法(review的用法和搭配)            }

  viewstate用法(review的用法和搭配)            set

  viewstate用法(review的用法和搭配)            …{

  viewstate用法(review的用法和搭配)                ViewState["ControlType"] = value;

  viewstate用法(review的用法和搭配)            }

  viewstate用法(review的用法和搭配)        }

  viewstate用法(review的用法和搭配)

  viewstate用法(review的用法和搭配)

  viewstate用法(review的用法和搭配)      ………………………

  viewstate用法(review的用法和搭配)        
protected
 
void
 Menu1_MenuItemClick(
object
 sender, MenuEventArgs e)

  viewstate用法(review的用法和搭配)        

{

  viewstate用法(review的用法和搭配)            if (!e.Item.Value.Equals(ControlType))

  viewstate用法(review的用法和搭配)            …{

  viewstate用法(review的用法和搭配)                phContainer.Controls.Add(Page.LoadControl(ControlType));  //这个和前面在BindData里给ControlType赋值一起是为了防止错误"Faild to load view state…"

  viewstate用法(review的用法和搭配)

  viewstate用法(review的用法和搭配)                phContainer.Controls.Clear();

  viewstate用法(review的用法和搭配)                ControlType = e.Item.Value;

  viewstate用法(review的用法和搭配)                phContainer.Controls.Add(Page.LoadControl(ControlType));

  viewstate用法(review的用法和搭配)            }

  viewstate用法(review的用法和搭配)

  viewstate用法(review的用法和搭配)        }

  如下两个地址可能包含一些有用的信息:

  http://weblogs.asp.net/vga/archive/2003/08/11/23498.aspx

  http://www.error-bank.com/microsoft.public.dotnet.framework.aspnet.webcontrols/19728_Thread.aspx

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/23616.html

(0)
上一篇 2023-10-22
下一篇 2023-10-23

相关推荐