页面项不是持久的
本文关键字: | 更新日期: 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();
}