列出Click事件之间丢失的项目

时间:2016-07-25 13:19:41

标签: asp.net

在我的代码顶部,我有以下代码:

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

    }

2 个答案:

答案 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中,所以不要在其中放入太多东西。然而,它对于小的临时值很有用。