在我的代码顶部,我有以下代码:
public class ImgData
{
public byte[] Image { get; set; }
public string Category { get; set; }
}
List<ImageData> list = new List<ImageData>();
我有2个点击事件
在其中一个中我有以下代码:
protected void btnAttendee_Click(object sender, EventArgs e)
{
ImageData data = new ImageData();
data.Category = "HR";
data.Image = imgByte1;
list.Add(data);
int cnt = list.Count(); // Count show 1 once I click here
}
在另一个地方,我有以下代码,我在上面的点击事件后触发:
protected void submit_Click(object sender, EventArgs e)
{
// When I try to retreive the cnt it shows 0 here. I am not deleting any items on the list so not sure why it did not retain what was in the list
int cnt = list.Count(); // should have count of 1 or more
}
答案 0 :(得分:1)
Web应用程序是无状态的。
在ASP.NET的上下文中,这意味着每次向服务器发出新请求时,都会创建页面类的新实例。因此,您上次使用数据填充的任何实例成员都将消失。一旦将结果页面发送到客户端,就会销毁先前的实例。
为了跨页面请求保留数据,您必须将其保留在某处。你有这方面的选择:
持久化数据的任何选项都有其自身的优缺点。因此,您需要确定最适合您需求的产品。例如,如果要将数据保持在会话状态,则可以这样写:
protected void btnAttendee_Click(object sender, EventArgs e)
{
ImageData data = new ImageData();
data.Category = "HR";
data.Image = imgByte1;
list.Add(data);
int cnt = list.Count(); // Count show 1 once I click here
Session["myList"] = list;
}
然后在此处检索:
protected void submit_Click(object sender, EventArgs e)
{
List<ImageData> list = (List<ImageData>)Session["myList"];
int cnt = list.Count(); // should have count of 1 or more
}
鉴于此,如果成员不再需要为实例级别,您甚至可能会重新修改您的类。它可能更好,只是一个方法级变量。
答案 1 :(得分:0)
这看起来像webforms代码。
点击将导致回发,当页面刷新时,您将丢失变量中保存的所有数据。您需要使用其他东西将它们存储在Session或ViewState之类的回发之间。
要记住一件事,ViewState保存在页面的html中,所以不要在其中放入太多东西。然而,它对于小的临时值很有用。