为什么我的ViewState没有被保留?

时间:2014-08-26 17:55:11

标签: c# asp.net viewstate

简单的问题,虽然可能是一个更好的标题,但是我不知道我在做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;
        }
    }
}

4 个答案:

答案 0 :(得分:2)

来自MSDN: 您可以在视图状态中存储的数据类型 您可以在视图状态中存储以下类型的对象:

  • 字符串
  • 整数
  • 布尔值
  • 数组对象
  • ArrayList对象
  • 哈希表
  • 自定义类型转换器

否则,您可以使用Serializable属性创建自己的类并使其可序列化。

对于您的情况,您不能编辑Table类以添加属性,因为您不拥有该属性。你可以做的是创建自己的类,它将使用你想要的表中的信息,并在你的类之间来回处理,可以在viewstate中使用Table类。

答案 1 :(得分:1)

我在您发布的代码中看到的唯一一件事就是您不需要将表格转换为ViewState。

尝试更改此内容:
     ViewState["masterSkills"] = (Table)tblSkillsMaster;
对此:
    ViewState["masterSkills"] = tblSkillsMaster;

从ViewState检索时必须进行强制转换。

答案 2 :(得分:1)

您可以尝试这样的测试 -

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 ,因为它不是可序列化

您可能希望使用而不是

答案 3 :(得分:1)

ViewState只能保存可序列化的对象,在这种情况下,System.Web.UI.WebControl.Table不可用于服务,因此您无法将其存储在视图状态中。相反,您可以使用DataTable和GridView来实现您的目标。