我正在使用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();
}
我想知道为什么会这样。一种解决方案是调用搜索方法并再次获取数据,但这不是必需的吗?
答案 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();