0

我使用 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();
    }

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

4

2 回答 2

3

您被许多人多次陷入的同一陷阱所困 - 这是页面生命周期。ASP.NET 通过假装您拥有一个包括服务器和浏览器的环境来欺骗您,但事实并非如此。HTTP 是无状态的。如果您需要在两个请求之间保持状态,您有几种选择:

  • 将状态序列化成所谓的ViewState比如发送给浏览器,然后回传给服务器
  • 将其保存在数据库中
  • 将其保存在会话中
  • 为需要检索的数据引入缓存,也就是说,BookInfo.Search具有相同参数值的顺序调用不会发出新的数据库请求(或获取数据所需的任何其他内容)
于 2014-08-06T11:07:09.933 回答
1

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

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

// storing
HttpContext.Current.Session["list"] = result;
// retrieving
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();
于 2014-08-06T11:13:55.757 回答