为什么我的ViewState没有被保存
本文关键字:保存 我的 ViewState 为什么 | 更新日期: 2023-09-27 18:19:39
这个问题很简单,尽管更好的标题可能是"当涉及到ViewStates
时,我不知道我在做什么,请帮帮我"。我想做的是单击btnAddSkills
,在预先存在的表的底部显示一个新行(如果不存在,则创建该表)。目前,第一行是在单击btnAddSkills
时添加的,但当第二次单击时,它会重写第一行(并且其中一个单元格内DropBox
的选定值丢失。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication3
{
public partial class _Default : System.Web.UI.Page
{
private Table tblSkillsMaster;
protected void Page_Load(object sender, EventArgs e)
{
//my past experience tells me something will need to go in here
}
protected void btnAddSkill_Click(object sender, EventArgs e)
{
if (ViewState["masterSkills"] != null)
{
tblSkillsMaster = (Table)ViewState["masterSkills"];
}
else
{
plhSkillsTable.Controls.Clear(); //plh is a PlaceHolder
tblSkillsMaster = new Table();
plhSkillsTable.Controls.Add(tblSkillsMaster);
}
tblSkillsMaster.Rows.Add(AddRow()); //handled elsewhere, cut for brevity
ViewState["masterSkills"] = (Table)tblSkillsMaster;
}
}
}
来自MSDN:可以在视图状态下存储的数据类型您可以在视图状态下存储以下类型的对象:
- 字符串
- 整数
- 布尔值
- 数组对象
- ArrayList对象
- 哈希表
- 自定义类型转换器
否则,您可以创建自己的类,并使用serializable属性使其可序列化。
对于您的情况,您不能编辑Table类来添加属性,因为您不拥有它。您可以创建自己的类,使用您想要的表中的信息,并处理类之间的来回,这些类可以在视图状态下与Table类一起使用。
您可以尝试这样的测试-
protected void btnAddSkill_Click(object sender, EventArgs e)
{
if (ViewState["masterSkills"] != null)
{
tblSkillsMaster = (Table) ViewState["masterSkills"];
}
else
{
plhSkillsTable.Controls.Clear(); //plh is a Placeholder
tblSkillsMaster = new Table();
plhSkillsTable.Controls.Add(tblSkillsMaster);
}
var row = new TableRow();
for (int cellNum = 0; cellNum < 3; cellNum++)
{
var cell = new TableCell {Text = cellNum.ToString()};
row.Cells.Add(cell);
}
tblSkillsMaster.Rows.Add(row);
// *** System.Web.UI.WebControls.Table is not serializable ***
// ViewState["masterSkills"] = tblSkillsMaster;
}
System.Web.UI.WebControls.Table不可序列化
但是,您不能将System.Web.UI.WebControls.Table添加到ViewState,因为它不可序列化。
您可能希望使用类而不是表。
我在您发布的代码中看到的唯一一件事是,您不需要强制转换表就可以将其放入ViewState中。
尝试更改:ViewState["masterSkills"] = (Table)tblSkillsMaster;
到此:ViewState["masterSkills"] = tblSkillsMaster;
从ViewState检索时必须强制转换。
ViewState只能容纳可序列化的对象,在这种情况下,System.Web.UI.WebControl.Table是不可序列化的,因此您无法将其存储在ViewState中。相反,您可以使用DataTable和GridView来实现您的目标。