在我的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
持久?我们的想法是使用泛型类添加所有用户输入,然后一次更新数据库。如果你知道另一种方法来实现这一点,我将非常感激。
提前致谢!
答案 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();
}