页面项不是持久的

本文关键字: | 更新日期: 2023-09-27 18:00:21

在我的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();
}

当尝试添加一个新项目,上面写着"Object reference not set to a instance of a Object"时,这总是失败的。。。

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

提前感谢!

页面项不是持久的

而不是

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。

如果您想通过多次回发保持内容的"活力",您必须将内容存储到数据库、使用Session、使用Viewstate或将其临时存储在共享服务器内存中。你选择哪一个取决于你的用例,

在您的情况下,我可能会添加一个asp:HiddenField runat="server"ID="HiddenFieldUsedStateID",每当发生更改时,我都会在其中以逗号分隔ID,然后将值读取到Page_Load中的通用列表中(在每个Page_Load上,而不仅仅是!IsPostBack)

这将利用Asp中的Viewstate机制。Net将值写入渲染的HTML中,并在每次发布时将其读回HiddenField的值

假设你的视图状态没有被禁用,你可以这样做,

  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();           
   } 
相关文章:
  • 没有找到相关文章