我试图了解这里发生的生命周期。我有一个asp列表视图,我在其中获取项目ID并将其写入类似的列表。
protected void ShareWith_OnItemBound(object sender, ListViewItemEventArgs e)
{
if (!IsPostBack)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
ListViewDataItem currentItemId = (ListViewDataItem)e.Item;
System.Web.UI.WebControls.DataKey currentDataKey = this.lvShareWithPanel.DataKeys[currentItemId.DataItemIndex];
int FriendId = Convert.ToInt32(currentDataKey["SharedUserId"]);
CurrentList.Add(FriendId);
}
}
}
我的列表是在方法之外定义的
private List<int> CurrentList = new List<int>();
之后,用户将一些新项添加到列表中,然后单击asp按钮继续。我正在运行当前列表与新列表的比较但在按钮单击后在调试中观察我发现我的列表“CurrentList”现在为空。为什么列表不在任何方法之外?
感谢您的帮助理解
答案 0 :(得分:3)
该列表没有州值。因此,您需要将列表存储在ViewState,Session状态或其他状态。
每个ASP.NET页面都会在页面加载之间丢失其值,并且只会从状态返回它们或者每次都输入它们。大多数控件在ViewState中存储值,这是特定于页面的。 This link应该有所帮助。
答案 1 :(得分:2)
所有页面的对象将在页面生命周期的末尾处理。因此,您需要在每次回发时创建并填充您的列表(或将其存储在Session
我不推荐的内容中。)
您可以使用页面的PreRender
事件来确保已触发所有事件:
protected override void OnPreRender(EventArgs e)
{
// why do you need a list as field variable at all? I assume a local variable is fine
List<int> CurrentList = new List<int>();
foreach(var currentItemId in lvShareWithPanel.Items)
{
System.Web.UI.WebControls.DataKey currentDataKey = lvShareWithPanel.DataKeys[currentItemId.DataItemIndex];
int FriendId = Convert.ToInt32(currentDataKey["SharedUserId"]);
CurrentList.Add(FriendId);
}
// do something with the list
}
请注意,您不应该像某人发表评论一样static
。这意味着您将为每个用户和每个请求使用相同的“实例”。
在这里你可以看到所有事件:
答案 2 :(得分:2)
ASP.NET是无状态,因此在回发期间数据会丢失。您需要手动跟踪CurrentList
,例如在Session / ViewState中。
public List<int> CurrentList
{
get
{
return (List<int>)Session["CurrentList"] ?? new List<int>();
}
set
{
Session["CurrentList"] = value;
}
}
答案 3 :(得分:0)
您可以将列表存储到ViewState和PageLoad事件中,将存储在ViewState中的List分配给您的类级列表。这是因为页面生命周期中放置了对象。