【发布时间】:2010-11-29 23:08:42
【问题描述】:
注意:这个问题已经完全修改,现在我有了一个更简单的例子。
我设置了一个示例页面,其中只有一个 ListView 和 ObjectDataSource。第一次出现页面时(!IsPostBack),我的GetList 方法被调用一次。在分页 (IsPostBack) 之后,GetList 方法被调用了两次——第一次使用旧的分页值,第二次使用新的值。
如果我在ListView 上设置EnableViewState="true",那么GetList 方法只会被调用一次。在我看来,ListView 想要一个“初始状态”,它要么从 ViewState 获得,要么通过重新运行该方法获得。
有什么方法可以禁用 ListView 上的 ViewState 并防止 SelectMethod 被调用两次?
ASPX 页面:
<asp:ListView ID="TestListView" runat="server" DataSourceID="ODS" EnableViewState="false">
<LayoutTemplate>
<asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
<asp:DataPager ID="TestPager" runat="server" PageSize="10">
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
</LayoutTemplate>
<ItemTemplate>
<div><%# Eval("Title") %></div>
</ItemTemplate>
</asp:ListView>
<asp:ObjectDataSource ID="ODS" runat="server" SelectMethod="GetList" SelectCountMethod="GetListCount"
TypeName="Website.Test" EnablePaging="true" />
ASPX 代码隐藏:
namespace Website
{
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public IList<DataItem> GetList(int maximumRows, int startRowIndex)
{
return GetListEnumerable().Skip(startRowIndex).Take(maximumRows).ToList();
}
public IEnumerable<DataItem> GetListEnumerable()
{
for (int i = 0; i < 100; i++)
{
yield return new DataItem { Title = i.ToString() };
}
}
public int GetListCount()
{
return 100;
}
}
public class DataItem
{
public string Title { get; set; }
}
}
【问题讨论】:
标签: asp.net listview objectdatasource