在剃刀视图中设置分页页面大小DropDownList

我想在我的asp.net网页表单页面大小选择下拉列表。 实际上我已经做到了,但是当我从下拉列表中更改页面大小时,没有任何改变。 我想我需要在我的控制器中写一些额外的东西,或者我的View可能是错的?

我的Index.cshtml视图:

@model TimeReportingWebApp.TimeReportViewMod @using PagedList.Mvc; .... @using (Html.BeginForm("Index", "Users")) { 

Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)

} @foreach (var item in Model.Model2) { }
@Html.ActionLink("Login","Index", new { sortOrder = ViewBag.LoginSortParm, currentFilter = ViewBag.CurrentFilter })
@Html.DisplayFor(modelItem => item.Login)
Page @(Model.Model2.PageCount Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }) ) Select page size @Html.DropDownList("PageSize", new SelectList(new Dictionary { { "10", 10 }, { "20", 20 }, { "100", 100 } }, "Key", "Value", Model.Model2.Count))

这是我的控制者。 这里我没有添加任何有关DropDownList的内容:

 public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page) { ViewBag.CurrentSort = sortOrder; if (searchString != null) { page = 1; } else { searchString = currentFilter; } ViewBag.CurrentFilter = searchString; var users = from s in db.Users.Include(u => u.CustomerProject).Include(u => u.Service).Include(u => u.Customer) select s; int pageSize = 20; int pageNumber = (page ?? 1); var inst = new TimeReportViewMod(); inst.Model1 = users.ToList(); inst.Model2 = users.ToPagedList(pageNumber, pageSize); return View("Index", inst); } 

您需要在

标记中包含下拉列表,以便将其值提交给控制器方法,并且该方法还需要一个附加参数来绑定到该值。 您还需要在Html.PagedListPager()包含所选值,以便在转到另一个页面时保留它。

你没有展示你的TimeReportViewMod模型,但是它包含属性IEnumerableIPagedList ,它也是IEnumerable所以第一个是不必要的。 但它应包含的是用于搜索和过滤的属性,以便您可以强烈绑定到属性并避免使用ViewBag 。 应该是这样的

 public class TimeReportVM { [Display(Name = "Find by name")] public string SearchString { get; set; } public string SortOrder { get; set; } [Display(Name = "Select page size")] public int PageSize { get; set; } public SelectList PageSizeList { get; set; } public IPagedList Users { get; set; } } 

注意:不清楚sortOrder的用途 – 你从不在任何地方使用它。 在查询中也没有使用searchString / currentFilter的值。

然后你的控制器方法是

 public ActionResult Index(string sortOrder, string searchString, int pageSize, int? page) { if (searchString != null) { page = 1; } // this query should be taking into account the values of sortOrder and searchString? var users = from s in db.Users.Include(u => u.CustomerProject).Include(u => u.Service).Include(u => u.Customer) select s; TimeReportVM model = new TimeReportVM() { SortOrder = sortOrder, SearchString = searchString, PageSize = pageSize, PageSizeList = new SelectList(new int[]{ 10, 20, 100 }), Users = users.ToPagedList(page ?? 1, pageSize); }; return View(model); } 

并在视图中

 @model TimeReportingWebApp.TimeReportViewMod @using PagedList.Mvc; .... @using (Html.BeginForm()) { @Html.LabelFor(m => m.SearchString) @Html.TextBoxFor(m => m.SearchString) @Html.LabelFor(m => m.PageSize) @Html.DropDownListFor(m => m.PageSize, Model.PageSizeList)  } .... Page @(Model.Users.PageCount < Model.Users.PageNumber ? 0 : Model.Users.PageNumber) of @Model.Users.PageCount @Html.PagedListPager(Model.Users, page => Url.Action("Index", new { page, sortOrder = Model.SortOrder, searchString = Model.SearchString, pageSize = Model.PageSize }) )