(家庭作业)MVC分页帮助
问题描述:
我试图放在一起使用ASP.NET MVC的一个非常简单的应用程序,显示新闻文章和分页他们。我有一些中途,但需要一些帮助,整理分页,并使其与搜索查询一起工作。(家庭作业)MVC分页帮助
这里是我的HomeController:
public ActionResult Index(String query, int? page)
{
// limit the number of articles per page
const int pageSize = 4;
// build the query
var ArticleQuery = from a in _db.ArticleSet select a;
// check if their is a query
if (!string.IsNullOrEmpty(query))
{
ArticleQuery = ArticleQuery.Where(a => a.headline.Contains(query));
}
// orders the articles
var OrderedArticles = ArticleQuery.OrderByDescending(a => a.posted);
// takes the ordered articles and paginates them
//var paginatedArticles = new PaginatedList(OrderedArticles.Skip((page ?? 0) * pageSize).Take(pageSize), page ?? 0, pageSize);
var paginatedArticles = new PaginatedList<Article>(OrderedArticles, page ?? 0, pageSize);
// return the paginated articles to the view
return View(paginatedArticles);
}
的想法是,控制器显示4项每页会按日期排序。这里是我对索引方法的看法:
<ul id="pagination">
<% if (Model.PreviousPage) { %>
<li><%= Html.ActionLink("<< First Page", "Index")%></li>
<li><%= Html.ActionLink("<< Previous Page", "Index", new { page=(Model.PageIndex-1) }) %></li>
<% } %>
<% if (Model.NextPage) { %>
<li><%= Html.ActionLink("Next Page >>", "Index", new { page = (Model.PageIndex + 1) })%></li>
<li><%= Html.ActionLink("Last Page >>", "Index", new { page = (Model.TotalPages - 1) })%></li>
<% } %>
</ul>
想法是,这两个分页链接将只显示条件为真。
最后这里是寻呼机的PaginatedList类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace NewsApp.Models
{
public class PaginatedList<T> : List<T>
{
public int PageIndex { get; private set; }
public int PageSize { get; private set; }
public int TotalCount { get; private set; }
public int TotalPages { get; private set; }
public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)
{
PageIndex = pageIndex;
PageSize = pageSize;
TotalCount = source.Count();
TotalPages = (int)Math.Ceiling(TotalCount/(double)PageSize);
this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
}
public bool HasPreviousPage
{
get
{
return (PageIndex > 0);
}
}
public bool HasNextPage
{
get
{
return (PageIndex + 1 < TotalPages);
}
}
}
注:我不希望使用任何第三方的组件,如MVCContrib等,因为这是一所大学的分配,从而会破坏目的。
现在分页工作正常,但是当我进行搜索时, /?query = test我希望能够页面结果,此刻他们迷路了:/
谢谢。
答
你没有提到你在做什么实际的错误,但我想我看到了什么问题:
这两条线将返回你的一个IEnumerable包含您的结果。
var paginatedArticles = OrderedArticles.Skip((page ?? 0) * pageSize).Take(pageSize).ToList();
return View(paginatedArticles);
然而,根据你的看法和您发布的辅助类,你视图期待PaginatedList
对象作为它的模型。
如果是这样的话,我会做以下(更新):
var paginatedArticles = new PaginatedList(OrderedArticles, page ?? 0, pageSize);
return View(paginatedArticles);
然后您认为应该返回到它合适的型号。这说:我不知道你为什么不使用存储库层,但除非你的应用程序只是一个页面,否则几乎总是一个好主意。
更新 --here就是我认为的完全控制逻辑应该是:
public ActionResult Index(String query, int? page)
{
const int pageSize = 4;
var ArticleQuery = from m in _db.ArticleSet select m;
// Searching
if (!string.IsNullOrEmpty(query))
{
ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query));
}
var OrderedArticles = ArticleQuery.OrderByDescending(m => m.posted);
var paginatedArticles = new PaginatedList(OrderedArticles, page ?? 0, pageSize);
// this will now be of type paginatedList. this class handles all of the paging for you, so no need to do that ahead of time
return View(paginatedArticles);
}
在这种情况下,PaginatedList不是一个帮手--its一个完整的对需要创建和传递类到你的模型。严格定义这个词的助手是完全不同的,可能在你的情况下不适用。
刚刚回答了类似的问题:http://*.com/questions/4659978/asp-net-mvc-pagination-using-take-and-skip/4662573#4662573 – Omu 2011-01-11 21:25:57
任何更新谢谢你。 – Cameron 2011-01-11 22:01:32