asp.net – 如何使用DataPager与服务器端寻呼?
|
我试图使用DataPager进行服务器端分页.这是我的代码 <asp:DataPager ID="pgrFooBars" PagedControlID="lvFooBars"
QueryStringField="page" runat="server" >
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
代码背后 protected void Page_Load(object sender,EventArgs e)
{
ConfigureBlogPostListView();
}
private void ConfigureBlogPostListView()
{
int pageNum;
int.TryParse(Request.Params["page"],out pageNum);
int pageSize = 20;
PagedList<IFooBar> FooBars = FooService.GetPagedFooBars(
new PagingSettings(pageNum,pageSize));
ListViewPagedDataSource ds = new ListViewPagedDataSource();
ds.AllowServerPaging = true;
ds.DataSource = FooBars;
ds.MaximumRows = pageSize;
ds.StartRowIndex = pageNum;
//TotalCount is the total number of records in the entire set,not just those loaded.
ds.TotalRowCount = FooBars.TotalCount;
lvFooBars.DataSource = ds;
lvFooBars.DataBind();
pgrFooBars.PageSize = pageSize;
pgrFooBars.SetPageProperties(pageNum,FooBars.TotalCount,true);
}
PagedList来自RobConery的有用的帖子http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/. 问题是DataPager似乎正在使用ListView的Count属性来确定记录的总数,在这种情况下为20.不知怎的,它需要知道有1500个记录,而不是20个记录. DataPager有一个属性TotalRowCount,但这是只读. 我从未看到服务器端分页的DataPager示例,但假设它可以做服务器端分页,否则QueryStringField属性有什么好处? 我知道您可以使用像这样的4GuysFromRolla http://www.4guysfromrolla.com/articles/031506-1.aspx这样的方法来做一个自定义的分页解决方案,但是我首先想知道在创建自定义解决方案之前是否可以使用DataPager解决方案. UPDATE dpFooBars.TotalRowCountComputed = false; dpFooBars.TotalRowCount = AnyNumberThatISoChoose; 我一直在寻找一些破解来完成同样的事情,但是看起来数据库的TotalRowCount是根据它绑定到的数据源中的实际数量来计算的.对我来说似乎很奇怪,Microsoft将同时创建一个ListViewPagedDataSource()类和一个DataPager,而不是一起工作,但这似乎是发生了什么. 更新2(AHA MOMENT?) 解决方法使用DataPager,服务器端寻呼的唯一方法是在标记中使用LinqDataSource(更新:这不是真的,见下文),并设置ListView的DataSourceID(如 ScottGu’s sample – step 6),而不是通过ListView DataSource属性.然而,我发现有一个 trick使这更可行,所以你可以通过代码隐藏定义你的LinqDataSource查询,而不是在标记(注意,文章说这将适用于任何DataSource控件,但我不认为是这样).这可能不会对您的情况有任何帮助,因为我注意到,您调用某种服务可能不会(并且不应该)返回一个IQueryable结果,这对于此工作是必需的.无论如何,无论如何,你有兴趣… aspx标记: <asp:ListView ID="lvFooBars" DataSourceID="dsLinq" ....>
......
</asp:ListView>
<asp:DataPager ID="pgrFooBars" PagedControlID="lvFooBars"
QueryStringField="page" runat="server" >
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
<asp:LinqDataSource id="dsLinq" runat="server" OnSelecting="dsLinq_Selecting" />
后台代码: protected void dsLinq_Selecting(object sender,LinqDataSourceSelectEventArgs e)
{
//notice this method on FooService requires no paging variables
e.Result = FooService.GetIQueryableFooBars();
}
注意,MSDN关于QueryStringField属性的状态:
更新:实际上,您可以使用ObjectDataSource控件(而不是LinqDataSource控件)使用ObjectDataSource控件来工作 – 请参阅this article and download the sample.使用ObjectDataSource并不像使用LinqDataSource控件那么简单,它使用的是较少的魔术linq内容(而是使用堆映射到业务/数据层方法的魔术字符串),并允许IEnumerable暴露您的数据访问方法而不是IQueryable. 尽管如此,我从来没有真正在我的UI标记中嵌入任何类型的DataSource控件(我相信这是必要的)的粉丝,所以我可能会指导DataBager控件,除了您在第一次更新中建议的小应用程序. 约翰,我注意到的另一件事是,你正在试图将标准的Asp.Net服务器控件(依赖于ViewState)与用作Asp.Net Mvc应用程序的辅助类开发的PagedList类结合在一起.虽然这可能有效,但可能会有更简单的路线. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在ASP.Net中如何做一个搜索表单?
- ASP.NET Azure中的Trace.WriteLine
- asp.net – IE 8和客户端缓存
- asp.net-mvc – MVC4 WebAPI原因短语?
- asp.net-mvc – ASP.NET MVC验证的唯一性
- asp.net-mvc – ASP.NET MVC – 从URL中删除控制器名称
- 从ASP.NET 3.5应用程序在IFRAME中运行GWT应用程序(包括Appl
- asp.net-mvc-3 – mvc3 – 如何从源代码禁用符号的htmlenco
- asp.net-mvc – ASP.NET MVC – 能够处理数组的自定义模型绑
- asp.net-mvc – 使用RadioButtons的可空值布尔的MVC3 Edito
