我在MVC中阅读了很多关于分页的文章和答案。 我已经设法使用分页(使用PagedList)创建搜索结果,但现在我需要另一件事。 我有一个类型列表,并根据类型我想浏览该类型的所有专辑。 网址是Home / Browse / 1(流派的id)。 如何分页这个结果,因为它已经有一个参数(genreid)? 感谢的
答案 0 :(得分:1)
如果你真的想了解如何分页,我建议你编写自己的自定义分页逻辑,而不是依赖别人的PagedList
抽象。
当您需要对结果进行分页时,还需要包括将发送到数据库的整个查询的其他2个方面:过滤和排序。< / p>
之所以如此,除非您同时将分页和过滤与分页结合使用,否则您将无法计算出正确的结果。
例如,假设我有一个包含100行的表,并且我希望每页显示10行。排序A-Z的前10行将与排序Z-A的前10行不同。因此,必须先对表进行排序,然后才能对其进行分页。
您的问题与过滤有关 - 您希望过滤掉不属于特定类型的所有相册。同样,这意味着您必须在对筛选结果进行分页之前应用筛选。
最终,您的控制器将不得不访问数据库以获得结果。您可以通过向数据库发送筛选和排序的查询进行分页,然后仅切出一个子集以向用户显示分页。然而,仅仅因为你并不意味着你应该。理想情况下,您希望发送应用筛选,排序和分页的db 1查询以准确返回所需的分页部分。
您应该能够通过以下查询执行此操作:
// assuming pageNumber is Nullable<int>, and is passed as action method argument
pageNumber = pageNumber ?? 1
var pageSize = 10;
var pageIndex = pageNumber.HasValue ? pageNumber.Value - 1 : 0;
var results = context.Albums
.Where(a => a.GenreId == genreId) // filtering
.OrderBy(a => a.GenreId) // sorting
.Skip(pageSize * pageIndex) // skip this many rows (pagination start at)
.Take(pageSize) // then give me this many rows (pagination chunk)
.ToList() // execute the query against the database
;
return view(results);
您的视图将具有类似以下的模型类型:
@model IEnumerable<Album>
我假设通过使用PagedList和MVC,您已经知道如何将pageNumber参数发送到控制器/操作方法。对于过滤URL(Home / Browse / 1),您已将过滤参数传递给action方法。
如果您决定也允许用户对结果进行排序,则还必须将排序信息传递到action方法参数中。上面的代码假设数据库中的自然顺序(通常由AlbumId)。
与pageSize相同。如果要使用户可以自定义查询的任何部分(sorted,filtering,pageSize,pageNumber),则必须将这些值作为参数传递给action方法。否则,控制器必须使用上例中的编译值。
答案 1 :(得分:0)
PagedList的创建者。你可以这样做:
http://localhost:1234/home/browse/1?page=2
public class HomeController : Controller
{
public object Browse(int genreId, int? page)
{
// the *page* variable is bound to the querystring value, not the route
return View(Genres.All().ToPagedList(page ?? 1, 10);
}
}