为什么列表在事件之间清空?

时间:2014-08-06 10:45:14

标签: c# asp.net list eventhandler

我正在使用List<>作为从数据库返回的一些数据的容器,如下所示:

List<BookInfo> result {get;set;}

protected void SearchButton_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            result = (new BookInfo()).Search(TextBox1.Text);
            ListView1.DataSource = result;
            ListView1.DataBind();

        }

    }

一切正常。但是,当我尝试在此类别的其他事件中对此列表进行排序时,它是空的。

protected void ListView1_Sorting(object sender, ListViewSortEventArgs e)
    {
        IComparer<BookInfo> comparer = new BookInfoOrdering();
        if (result != null)
        {
            result.Sort(comparer);

        }
        ListView1.DataSource = result;
        ListView1.DataBind();
    }

我想知道为什么会这样。一种解决方案是调用搜索方法并再次获取数据,但这不是必需的吗?

2 个答案:

答案 0 :(得分:3)

你被许多人困住的同一个陷阱困住了 - 这是页面生命周期。 ASP.NET愚弄你假装你有一个环境,包括服务器和浏览器,但事实并非如此。 HTTP是无状态的。如果您需要在两个请求之间保持状态,则有几个选项:

  • 将状态序列化为所谓的ViewState,例如将其发送到浏览器并将其发回服务器
  • 将其保存在数据库中
  • 将其保存在会话中
  • 为需要检索的数据引入缓存,即对具有相同参数值的BookInfo.Search的顺序调用不发出新的数据库请求(或者获取数据所需的任何其他内容)

答案 1 :(得分:1)

这适用于桌面应用程序,但不适用于asp.net网站。从一个回发中检索的服务器端数据不会存储用于下一次回发。

有几种方法可以在回发之间存储数据。例如,使用网站的会话状态:

// storing
HttpContext.Current.Session["list"] = result;
// retirieving
List<BookInfo> temp = (List<BookInfo>)HttpContext.Current.Session["list"];

您还应该能够从ListView中检索绑定的列表。

 IComparer<BookInfo> comparer = new BookInfoOrdering();
 List<BookInfo> temp = (List<BookInfo>)ListView1.DataSource;
 temp.Sort(comparer);
 ListView1.DataSource = temp;
 ListView1.DataBind();