在使用asp.net mvc查询时候的分页

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在使用asp.net mvc查询时候的分页相关的知识,希望对你有一定的参考价值。

情景是这样的:
我使用asp.net mvc开发.
要做查询.
在页面加载的时候,我不会去查询,因为我是需要有条件的.
在我把条件都选好之后,我点击查询,这个时候是post过去的.然后我会进行分页.一般分页都是get当前的页数达到分页效果的.可是我的条件怎么从post的action里边传递到get的action呢?我是想把这些条件也返回到页面中.可是这个时候出了querystring还有别的方法能够在get的action里得到这些条件吗?
要是string还好了.可是条件很复杂又怎么办呢?
刚才有人回答了,但是还是需要说明点。我的数据来源必须是在给定条件下才能获得。而分页一般又是通过传递currentpageindex来获得。与其这样,我还不如每次都post,改变页面值就ok,或者我就ajax实现了

你无需将条件从post的action传到get的action,虽然可以,但这不是被建议的用法。
一个更好的做法是用“过虑属性”(filter attribute),可能你的post的action的形式如下:
[HttpPost]//或许你并没有这样用,或许你就是这样用的。。
public ViewResult MyAction(int page)
//...
那么,你应该知道(或是可以)这么做:
[HttpGet]
public ViewResult MyAction(int page)
//...

MyAction的形式参数page会通过ASP.NET MVC的“值提供程序(value provider)”提供,它会按优先级从下以列表中为page绑定一个值:
Request.Form
RouteData.Values
Request.QueryString
Request.Files

这也就意味着,你的条件完全可以以一个<input name="page" type="...">的html域接收用户的输入,当你提交表单时,name等于page(name="page")的表单里的域(就是html input)的值将作为MyAction的形参的值,且表单域的值是首先的。

针对补充问题:
明白你的意思了,你是想通过Get请求而又不把条件暴露在URL中对吧,如果是的话,那么有一个好的办法是直接用《Pro ASP.NET MVC2 Framework(second edition)》第四章还是第五章里的分页例子的思路。
大概的思路是这样的,让每页对应一个URL,这样的好处之一是当客户看上了某一页(假设是第三页)的内容,此时他右击页面选择“加入收藏夹”,而当他几天后从收藏夹打开收藏的链接时,他得到的还将是第三页的数据。这在Web Form中通过简单的办法是很难做到的。
话远了,为了实现这个办法,需要为此维护一个拥有CurrentPageIndex属性的View Model,并在配置Route的时候加个CurrentPageIndex项。。

寝室要断电了,如果你不想下那本电子书的话(当然,我推荐你下),明天继续。。

希望这会是最终版本的补充:
以下是Steven Sanderson的《Pro ASP.NET MVC2 Framework(second edition)》上的例子,以及一些我的说明(以下说明都基于你对C#一些或新或旧语法的了解):
整体的思想是把“分页”做成一个组件,利于复用。
具体的是,首先给HtmlHelper扩展一个方法(有关扩展方法可参数相关文档,如MSDN),这个方法返回的是一个能被<%%>语法解析的MvcHtmlString对象,事实上这个对象包含的内容则是HTML标签<a>。扩展方法如下:
public static class PagingHelpers

public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pageInformation,
Func<int, string> pageUrl)

StringBuilder result = new StringBuilder();

for (int i = 1; i <= pageInformation.TotalPages; i++)

TagBuilder tag = new TagBuilder("a");

tag.MergeAttribute("href", pageUrl(i));
tag.InnerHtml = i.ToString();

if (i == pageInformation.CurrentPage)

tag.AddCssClass("selected");


result.AppendLine(tag.ToString());


return MvcHtmlString.Create(result.ToString());


从方法体可以理解到,需要分页的数据的每一页此方法都将为其提供一个链接,如此每一页数据就会对应一个URL。正如之前我说过那样,这会是一个好的用户体验。

再看视图(View)是怎样调用此方法来实现分布的,以下是名为List(List为强类型(strongly typed)视图,其类型为ProductsListViewModel,对此类型一会儿将作解释)的视图调用此方法来实现分页的代码:
<%: Html.PageLinks(Model.PagingInfo,i => Url.Action("List", new category = Model.CurrentCategory, page = i ))%>
可以看到,调用扩展的分页方法时我们传入了两个实参,一个是Model.PagingInfo,一个是lambda表达式(有关lambda表达式可参考相关文档,如MSDN)i => Url.Action("List", new category = Model.CurrentCategory, page = i )。
在看第一个参数Model.PagingInfo之前,我们先看看Model的类型定义:
public class ProductsListViewModel

public IList<Product> Products get; set;
public PagingInfo PagingInfo get; set;
public string CurrentCategory get; set;

此类型有三个属性,在此我们仅需关心其第二个属性,PagingInfo类型的PagingInfo(名字取成一样,希望不要混淆)属性。PagingInfo类型定义如下:
public class PagingInfo

public int CurrentPage get; set; //当前页码
public int TotalItems get; set; //数据总记录数
public int ItemsPerPage get; set; //每页记录数

public int TotalPages//总页数

get

return (int)(Math.Ceiling((decimal)TotalItems / ItemsPerPage));



这就是我们分页时所关心的信息,也正是我们调用扩展的分页方法时需要传递过去的信息。当然,这些信息不会凭空而生,而需要我们自己设置。

我所举的例子是Steven Sanderson的《Pro ASP.NET MVC2 Framework(second edition)》所提供的一个以视图List来分页产品的例子。应当注意,用户从浏览器请求/list时,他请求的不是list.aspx那个页面(虽然我们为用户显示的就是它),他请求的是我们一个叫List的Action。这也就意味着,为输出用户需要的那个List.aspx我们需要做的准备工作(当然,不是业务逻辑)都将在名叫List的Action里进行,Action List定义如下:
public ViewResult List(string category, int page = 1/*C#的形参默认值(参考C# 4’s
optional parameter)*/)

var productsToShow = (category == null ? productsRepository.Products : productsRepository.Products.Where(x => x.Category == category));
var viewModel = new ProductsListViewModel

Products = productsToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
PagingInfo = new PagingInfo CurrentPage = page, TotalItems = productsToShow.Count(), ItemsPerPage = PageSize ,
CurrentCategory = category
;

return View(viewModel);

可以看到,当用户首次请求List时,他很有可能没有给一个page参数(当然,在你的应用中你完全可以有你的选择),为此我们给了它一个默认的值。如果你用的不是C#4.0,那么你可以把int page = 1换成[DefaultValue(1)] int page,在这里它们的效果是一样的。

接下来是对实现分页的整个过程的阐述:
不管用户第一次请求是否带了page这个参数,在Action List执行过程中,Action List便会构造一个ProductsListViewModel对象,这个对象正是分页方法所需要的信息。当Action List顺利地执行完成return View(viewModel)时,视图List.aspx将收到Action List返回的viewModel并把它作为视图的Model属性。
当视图List.aspx执行到<%: Html.PageLinks(Model.PagingInfo,i => Url.Action("List", new category = Model.CurrentCategory, page = i ))%>时(视图得先在服务器上编译执行,产生最后的HTML才发送到客户端),它就会调用扩展方法Html.PageLinks()为每页生成一个唯一的<a>标签,这样也就作到了一页数据对应一个URL的良好用户体验。
还需说明的一点是,这里的<a>标签导航到的可不是某个.aspx页面,而是某个Action(当然,本例中是Action List)。

最后还有一处配置,就是增加一个Route项,形式如下:
routes.MapRoute(
null,
"category/Pagepage",
new controller = "Products", action = "List" ,
new page = @"\d+" );
这样就做到了应你需求,无QueryString。。

当然,如有需要,加上AJAX,用户将得到更好的体验。

如果不明白的话,请补充问题,希望我能帮到你。
如果这对你有帮助话,请将此标为最佳答案,谢谢。
参考技术A 用jquery+handler的方式来JSON传输,示例如下:
$.post("Handler.ashx", ID: id, Num: num , function (result)
if (result != "")
alert(result);

);
参考技术B Server.什么来着 好像也能 参考技术C 用linq可以吗?

带有 ASP.NET MVC 和 AJAX 的分页表 [关闭]

【中文标题】带有 ASP.NET MVC 和 AJAX 的分页表 [关闭]【英文标题】:Paged table with ASP.NET MVC and AJAX [closed] 【发布时间】:2010-09-22 02:38:40 【问题描述】:

我正在寻找在 ASP.NET MVC 中通过 AJAX 提供的排序、过滤和分页实现结果分页表的良好模式。在我看来,我应该让我的控制器操作只提供数据而不是标记以保持关注点的分离——因此 Ajax 回调将提供新的表数据和分页器设置,客户端将使用这些数据和寻呼机重新呈现表.或者,我可以让控制器返回一个部分视图,我只需在页面上的容器内替换它。

我是 ASP.NET MVC 世界的新手,所以我也有兴趣听取意见和其他替代方案。

你会怎么做呢?

我也有兴趣了解与 Ajax 配合良好的 jquery 表插件。

【问题讨论】:

【参考方案1】:

我喜欢使用 Telerik 扩展 MVC,它们是开源的并且有很多示例: http://www.telerik.com/products/aspnet-mvc/grid.aspx

【讨论】:

【参考方案2】:

不要使用表格排序器。当您从表中删除一些记录时,很难通过分页和排序重新呈现表。我很难受。

【讨论】:

【参考方案3】:

我真的很喜欢tablesorter

它更轻量级,更易于管理......

【讨论】:

【参考方案4】:

这里有几个结帐选项:

jQuery Flexigrid Yahoo DataTable Ext JS

我倾向于雅虎的解决方案 atm,因为它提供的不仅仅是网格控件。

【讨论】:

嗨@ToddSmith - 关于this的任何想法【参考方案5】:

JQuery Grid 似乎可以满足您的要求。它有很好的文档和示例。我还没有使用它,但我打算很快使用它。

【讨论】:

以上是关于在使用asp.net mvc查询时候的分页的主要内容,如果未能解决你的问题,请参考以下文章

带有 ASP.NET MVC 和 AJAX 的分页表 [关闭]

使用vb在asp.net中没有gridview的分页

用ASP.NET MVC2做了个简单的增删改查例子,一般分页也做了,可是查询分页时不行!请看问题补充。

asp.net mvc 分页之后Request.Form获取不到数据

ASP.NET 中的分页;过滤后页数不变

ASP.NET MVC3 - 仅分页(不显示 WebGrid)