知识大全 ASP.NET MVC实践 对查询后分页处理的解决方案
Posted 知
篇首语:只要学不死,就往死里学。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ASP.NET MVC实践 对查询后分页处理的解决方案相关的知识,希望对你有一定的参考价值。
ASP.NET MVC实践 对查询后分页处理的解决方案 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
一 前言
GridView中的分页是用post做的 所以将查询表单中的内容可以存到ViewState中 翻页的时候可以利用 实现起来就比较容易些 而在mvc中这些就要我们自己来做了 Contrib中的分页只能应付简单应用 对于查询后结果的分页没做处理 下面我们来改造一下这个分页程序
二 准备工作
首先准备一个数据源
数据源准备
public class News
public int ID get; set;
public string Author get; set;
public string Title get; set;
public DateTime CreateTime get; set;
public class ListNews
public static List<News> GetList()
List<News> list = new List<News>();
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now AddHours( ) );
list Add(new News ID = Author = lfm Title = 中华人民共和国 周年 CreateTime = DateTime Now );
return list;
然后添加一个View
View
<%Html BeginForm();%>
Title:<%=Html TextBox( title Request Form[ title ]??Request QueryString[ title ]) %>
Author:<%=Html TextBox( author Request Form[ author ]??Request QueryString[ author ]) %>
<input type= submit value= 查询 />
<%Html EndForm(); %>
<%=Html Grid(Model) Columns(column=>
column For(x=>x ID) Named( News ID );
column For(x => Html ActionLink(x Title NewsDetils new newsId = x ID )) DoNotEncode();
column For(x => x Author) Header( <th> +Html ActionLink( 作者 CustomPager newdesc = Convert ToBoolean(ViewData[ desc ]) sortName= Author )+ </th> );
column For(x=>x CreateTime);
)
%>
<%= Html Pager(Model ViewData[ search ])%>
这里的分页代码和Contrib中略有不同 一会儿我们来讲解这个不同的原因
添加一个Controller
Controller
public ActionResult CustomPager(int? page)
int pageSize = ;
int pageNumber = page ?? ;
var list = ListNews GetList()
Where(p => p Title Contains(Request QueryString[ title ] ?? ))
Where(p => p Author Contains(Request QueryString[ author ] ?? ));
var pageList=list Skip((pageNumber ) * pageSize) Take(pageSize);
int total = list Count();
CustomPagination<News> customes = new CustomPagination<News>(pageList pageNumber pageSize total);
return View(customes);
[AcceptVerbs(HttpVerbs Post)]
public ActionResult CustomPager(FormCollection formCollection)
int pageSize = ;
int pageNumber = ;
var list = ListNews GetList() Where(p => p Title Contains(Request Form[ title ]))
Where(p => p Author Contains(Request Form[ author ]));
int total = list Count();
var pageList = list Skip((pageNumber ) * pageSize) Take(pageSize);
CustomPagination<News> customes = new CustomPagination<News>(pageList pageNumber pageSize total);
Dictionary<string string> d = new Dictionary<string string>();
d Add( title Request Form[ title ]);
d Add( author Request Form[ author ]);
ViewData[ Search ] = d;
return View(customes);
注 这部分内容的详细讲解可以参见 ASP NET MVC实践系列 Grid实现(下 利用Contrib实现)
三 Contrib的分页源码分析
我们先把Pagination和Pager两个文件夹中的源码copy出来 经过分析我们知道CustomPagination是实现了IPagination接口的集合 我们把数据整合到CustomPagination中就可以使用Pager进行分页了 PaginationExtensions是辅助HtmlHelper使用扩展方法的静态类
四 Pager类改造
经过分析我们发现Pager是通过ToString()方法将分页字符串输出到前台的 所以我们这里需要先改造Pager的ToString()方法 我们常常希望分页是这样显示的
上一页 下一页 所以先将ToString()方法改造如下
ToString方法
public override string ToString()
if (_pagination TotalItems == )
return null;
var builder = new StringBuilder();
builder Append( <div class= + _pageStyle + > );
if (_pagination PageNumber > )
builder Append(CreatePageLink(_pagination PageNumber _pagePrev));
else
builder Append(CreatePageText(_pagePrev));
for (int i = ; i < _pagination TotalPages; i++)
var current = i + ;
if (current == _pagination PageNumber)
builder Append(CreatePageText(current ToString()));
else
builder Append(CreatePageLink(current current ToString()));
builder Append( );
if (_pagination PageNumber < _pagination TotalPages)
builder Append(CreatePageLink(_pagination PageNumber + _pageNext));
else
builder Append(CreatePageText(_pageNext));
builder Append(@ </div> );
return builder ToString();
这里需要交代一下将要实现查询分页的原理 这个方案中我们将会把查询的信息附加到分页的Url上 首先我们会把需要附加的条件添加到一个Dictionary<string string>类中 然后传给Pager类进行处理
下面我们来改造一下CreateQueryString方法
CreateQueryString
private string CreateQueryString(NameValueCollection values)
var builder = new StringBuilder();
if (_searchValues != null)
builder = GetSearchPage(values);
else
foreach (string key in values Keys)
if (key == _pageQueryName)
//Don t re add any existing page variable to the querystring this will be handled in CreatePageLink
continue;
foreach (var value in values GetValues(key))
builder AppendFormat( & = key HttpUtility UrlEncode(value));
return builder ToString();
/// <summary>
/// 根据传入的_searchValues来组织分页字符串
/// </summary>
/// <param name= values ></param>
/// <returns></returns>
private StringBuilder GetSearchPage(NameValueCollection values)
var builder = new StringBuilder();
Dictionary<string string> dictionary = new Dictionary<string string>();
foreach (var item in _searchValues)
dictionary Add(item Key item Value);
foreach (string key in values Keys)
if (key == _pageQueryName)
//Don t re add any existing page variable to the querystring this will be handled in CreatePageLink
continue;
foreach (var value in values GetValues(key))
if (_searchValues Keys Contains(key))
builder AppendFormat( & = key HttpUtility UrlEncode(dictionary[key]));
dictionary Remove(key);
else
builder AppendFormat( & = key HttpUtility UrlEncode(value));
foreach (var item in dictionary)
builder AppendFormat( & = item Key HttpUtility UrlEncode(item Value));
return builder;
这里边主要添加的就是这个GetSearchPage方法 这个方法就是根据客户端传入的查询条件来组织显示分页字符串的
五 缺点
因为时使用附加url的方式实现的 所以对于查询条件过多的时候可能有问题 有空我会再实现一个post方案供大家参考 另外这里大家还需要注意的就是url中的查询字符串的名字不能重复 如果重复会直接被替换 详见源码
cha138/Article/program/ASP/201311/21723相关参考
ASP.netMVC自定义错误处理页面 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在ASPN
ASP.NET分页链接方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ///<summ
简单的ASP.NET无刷新分页 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
ASP.NET利用存储过程实现分页 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先说下思路写
知识大全 asp.net中mvc使用ajax提交参数的匹配问题解决探讨
本文为大家介绍下使用javaScript解决aspnet中mvc使用ajax提交参数的匹配问题遇到类似情况的朋友可以参考下希望对大家有所帮助 想到在aspnet的mvc中如果使用ajax向服
ASP.NET程序中用Repeater实现分页 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一
一个ASP.Net的DataGrid分页控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 写的
ASP.NET长文章分页显示函数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! publicst
Asp.Net可定制分页用户控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 介绍借助AspN
ASP.NET存储过程自定义分页详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n