再次关于MVC中的分页(Razor)

时间:2012-04-10 20:05:43

标签: asp.net-mvc-3

我在MVC中阅读了很多关于分页的文章和答案。 我已经设法使用分页(使用PagedList)创建搜索结果,但现在我需要另一件事。 我有一个类型列表,并根据类型我想浏览该类型的所有专辑。 网址是Home / Browse / 1(流派的id)。 如何分页这个结果,因为它已经有一个参数(genreid)? 感谢的

2 个答案:

答案 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);
  }
}