页面项目不持久?

时间:2011-06-24 05:53:11

标签: c# asp.net generics persistence

在我的ASP.NET页面中,我有一个通用类,定义如下:

public partial class log_states : BasePage
{
    protected class StatesUsed
    {
        public int StateCode { get; set; }
        public string StateName { get; set; }
    }
    private List<StatesUsed> _statesUsed;
}

在Page_Load()事件中,我像下面一样初始化_statesUsed,并将其绑定到网格:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        _statesUsed = new List<StatesUsed>();
        BindMyGrid();
    }
}

private void BindMyGrid()
{
    gvStates.DataSource = _statesUsed;
    gvStates.DataBind();
}

然后我有一个表单来添加新状态。当用户添加状态时,我正在尝试将其添加到本地_statesUsed变量,并重新绑定网格。例如:

protected void btnAddState_Click(object sender, EventArgs e)
{
    _statesUsed.Add(new StatesUsed { StateCode = 1, StateName = "Test" });

    BindMyGrid();
}

当尝试添加新项目“对象引用未设置为对象实例”时,这总是失败...

如何保持_statesUsed持久?我们的想法是使用泛型类添加所有用户输入,然后一次更新数据库。如果你知道另一种方法来实现这一点,我将非常感激。

提前致谢!

3 个答案:

答案 0 :(得分:1)

如果你想通过多个回发来保持“活着”,你必须将东西存储到数据库,使用Session,使用Viewstate,或者将它临时存储在共享服务器内存中。您选择哪一项取决于您的使用案例,

在你的情况下,我可能会添加一个asp:HiddenField runat =“server”ID =“HiddenFieldUsedStateIDs”,其中我写了以逗号分隔的ID逗号,然后将值读入Page_Load中的泛型列表(on 每个 Page_Load,而不仅仅是!IsPostBack)

这将利用Asp.Net中的Viewstate机制将值写入呈现的HTML并将其读回每个帖子的HiddenField值

答案 1 :(得分:1)

而不是

private List<StatesUsed> _statesUsed;

我通常使用类似的东西:

private List<StatesUsed> _statesUsed
{
    get
    {
        var result = ViewState["_stateUsed"] as List<StatesUsed>;

        if ( result == null )
        {
            result = new List<StatesUsed>();
            ViewState["_stateUsed"] = result;
        }

        return result;
    }
}

即。我将页面类变量持久化到ViewState

答案 2 :(得分:-1)

假设您的视图状态未被禁用,您可以这样做,

  protected void btnAddMat_Click(object sender, EventArgs e) 
    {     
         List<StatesUsed> temp = null;  

        temp =  (List<StatesUsed>)gvStates.DataSource;
        if(temp != null)
          temp.Add(new StatesUsed { StateCode = 1, StateName = "Test" });                    
gvStates.DataBind();           
   }