未能加载视图状态错误
小弟因为不想每次回发都从数据库提取数据就在第一次加载时将数据存放在了ViewState中
if(!IsPostBack)
{
ViewState["TablePart"]=this.GetTablePart();
ViewState["SetStatus"]=this.GetTableStatus();
ViewState["ArrFile"]=this.GetTableFile();
HiddenDetail();
}
private DataTable GetTablePart()
private DataSet GetTableStatus()
private ArrayList GetTableFile()
然后我点击新增按钮时就在ViewState中添加数据行
可是我更新页面重新生成table时就报如下错误
------------------------------------------------------------------------------------------
未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Web.HttpException: 未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配。
源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
堆栈跟踪:
[HttpException (0x80004005): 未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配。]
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +189
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +414
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +414
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +414
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +414
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +414
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +414
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +414
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +414
System.Web.UI.Control.AddedControl(Control control, Int32 index) +291
System.Web.UI.ControlCollection.Add(Control child) +153
System.Web.UI.WebControls.RowControlCollection.Add(Control child) +33
System.Web.UI.ControlCollection.AddAt(Int32 index, Control child) +26
System.Web.UI.WebControls.RowControlCollection.AddAt(Int32 index, Control child) +37
System.Web.UI.WebControls.TableRowCollection.Add(TableRow row) +29
CECERP.IE.Sales.Order.BatchProcess.ProcessStatus_FullControl_Part.BindPartItems()
CECERP.IE.Sales.Order.BatchProcess.ProcessStatus_FullControl_Part.BindPart()
CECERP.IE.Sales.Order.BatchProcess.ProcessStatus_FullControl_Part.InitPage()
CECERP.IE.Libraries.Tools.Templates.GenericPage.Page_Load(Object sender, EventArgs e) +165
System.EventHandler.Invoke(Object sender, EventArgs e) +0
System.Web.UI.Control.OnLoad(EventArgs e) +67
System.Web.UI.Control.LoadRecursive() +35
System.Web.UI.Page.ProcessRequestMain() +720
问题点数:100、回复次数:9Top
1 楼hhdehh(默蛇)回复于 2005-07-04 10:13:55 得分 0
upTop
2 楼houlinghouling(秋水伊)回复于 2005-07-04 10:28:25 得分 40
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconmantainingstateincontrol.htmTop
3 楼hhdehh(默蛇)回复于 2005-07-04 10:35:09 得分 0
看不明白,跟我的这个问题好像关系不大。哪位能够解释一下。Top
4 楼hhdehh(默蛇)回复于 2005-07-04 10:54:57 得分 0
upTop
5 楼hhdehh(默蛇)回复于 2005-07-04 11:32:44 得分 0
upTop
6 楼cuike519(I will be back!)回复于 2005-07-04 23:04:53 得分 40
这是错误可能是由于当前的在重新建立时产生了错误,可能是由于在请求页面前后你创建了新的控件。
我认为你这些数据保存在客户端是不合适的。这样不但增加了对象的序列化的时间开销还大大增加了网络开销,与其这样还不如将他们放到Session里面或者放到Cache里面,后者更合理一些。
Viewstate用在这里我认为很不合适!你可以考虑上面提到的其他解决方法。Top
7 楼renyu732(Sysinfo)回复于 2005-07-05 00:33:19 得分 20
upTop
8 楼hhdehh(默蛇)回复于 2005-07-08 10:58:11 得分 0
to: cuike519(marshal)
你说了原因,可是没有说解决方案,怎么解决这类问题哟?
Top
9 楼hhdehh(默蛇)回复于 2005-07-08 11:24:46 得分 0
我做了一个动态添加控件的实验一切良好,郁闷in
-----------------------------------------------------
namespace hhExecute
{
/// <summary>
/// _Default 的摘要说明。
/// </summary>
public class _Default : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Table Table1;
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
{
ViewState["state"]=1;
Button btn=new Button();
btn.Text="abc";
Table1.Rows[0].Cells[0].Controls.Add(btn);
}
BindTable();
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void BindTable()
{
int i=int.Parse(ViewState["state"].ToString());
for(int j=0;j<i;j++)
{
Button btn=new Button();
TableRow tr=new TableRow();
TableCell tc=new TableCell();
btn.Text=j.ToString();
tc.Controls.Add(btn);
tr.Cells.Add(tc);
Table1.Rows.Add(tr);
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
Button btn=new Button();
int i=int.Parse(ViewState["state"].ToString());
i++;
btn.Text=i.ToString();
ViewState["state"]=i;
TableRow tr=new TableRow();
TableCell tc=new TableCell();
tc.Controls.Add(btn);
tr.Cells.Add(tc);
Table1.Rows.Add(tr);
}
}
}Top




