【问题标题】:Why is list emptying itself between events?为什么列表在事件之间清空自己?
【发布时间】:2014-08-06 10:45:13
【问题描述】:

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

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

【问题讨论】:

  • 结果的范围是什么?这里没有足够的信息来查看任何明显的问题
  • 我猜这很可能发生在两个单独的回发中,并且result 没有第二次(重新)填充。
  • 显示 Page_Load 代码....
  • 好的,这显然是一个回发问题。有没有办法在回发之间填充result?我认为这会比再次从数据库中获取数据要快一些..
  • 根据有多少用户将同时使用您的网站,您可以将列表存储在会话中,但还有更好的替代方案。

标签: c# asp.net list eventhandler


【解决方案1】:

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

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

【讨论】:

  • @Jan. 那么你期待什么样的答案呢?我不能告诉你是应该偏爱 ViewState、Session 还是数据库——这是一个只有你才能做出的设计选择。
  • @Jan - 那么您可能需要重新表述您的问题。目前它显示“为什么列表会自动清空?” “我只是想知道发生了什么。”我回答了这些问题。
【解决方案2】:

这适用于桌面应用程序,但不适用于 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2015-02-23
    • 2018-11-03
    • 2021-10-11
    相关资源
    最近更新 更多