Mvc Asp排序项目

我在我的应用程序中使用PagedList.MVC进行分页。 这工作正常。 分页工作正常,OrderBy下拉列表工作正常。 当我从下拉列表中选择值时,它会给出所需的排序结果。 我的意思是,如果我选择AZ然后它按升序排序项目,但当我点击第二页或下一页时,它不排序任何项目,url变为这样

HTTP://本地主机:41213 /首页/产品页= 2的pageSize = 6

而且我怎样才能使这个pageSize = 6成为动态? 我想把它放在像{5,10,15,20}这样的下拉列表中,当用户选择一个值时,它应该显示所选择的项目数。

调节器

[HttpGet] public ActionResult Products(int? OrderBy, int page=1, int pageSize=6) { private Shopping db = new Shopping(); switch (OrderBy) { case 1: List listProductsasc = db.Products.OrderBy(p => p.Name).ToList(); PagedList modelasc = new PagedList(listProductsasc, page, pageSize); return View(modelasc); case 2: List listProductsdesc = db.Products.OrderByDescending(p => p.Name).ToList(); PagedList modeldesc = new PagedList(listProductsdesc, page, pageSize); return View(modeldesc); default: List listProducts = db.Products.ToList(); PagedList modeldefault = new PagedList(listProducts, page, pageSize); return View(modeldefault); } } 

视图

 @model PagedList.IPagedList @using PagedList.Mvc 
@using (Html.BeginForm("Products", "Home", FormMethod.Get, new { id = "Form1" })) {
Sort by: @Html.DropDownList("OrderBy", new List { new SelectListItem{ Text="AZ", Value = "1" }, new SelectListItem{ Text="ZA", Value = "2" } }, "-- Order By --")
}

@Html.PagedListPager(Model, page => Url.Action("Products", new { page, pageSize = Model.PageSize })) Showing @Model.FirstItemOnPage to @Model.LastItemOnPage of @Model.TotalItemCount Products

例如,您需要修改PagedListPager()方法的路由参数以包含排序顺序的值

 @Html.PagedListPager(Model, page => Url.Action("Products", new { OrderBy = ViewBag.SortOrder, page, pageSize = Model.PageSize })) 

然后在该方法中,包括

 ViewBag.SortOrder = OrderBy; 

在返回视图之前。 但是,更好的方法是使用包含视图使用的属性的视图模型,这将解决代码的其他问题(例如,如果选择"ZA"选项并提交表单,则在返回时,集合为已排序,但下拉列表显示"-- Order By --"排序依据"-- Order By --"表示未排序。您应该查看模型

 public class ProductsVM { [Display(Name = "Sort by:")] public int? OrderBy { get; set; } public IEnumerable OrderList { get; set; } public int Page { get; set; } public int PageSize { get; set; } PagedList Products { get; set; } } 

并且控制器方法将是

 [HttpGet] public ActionResult Products(int? orderBy, int page=1, int pageSize=6) { private Shopping db = new Shopping(); IEnumerable products = db.Products; // not .ToList() if (orderBy == 1) { products = products.OrderBy(p => p.Name); } else if (orderBy == 2) { products = products.OrderByDescending(p => p.Name) } ProductsVM model = new ProductsVM { OrderBy = orderBy, OrderList = new List { new SelectListItem{ Text="AZ", Value = "1" }, new SelectListItem{ Text="ZA", Value = "2" } }, Page = page, PageSize = pageSize, Products = new PagedList(products, page, pageSize); }; return View(model); } 

最后修改您的视图以使用视图模型

 @model ProductsVM .... @using (Html.BeginForm("Products", "Home", FormMethod.Get)) { @Html.LabelFor(m => m.OrderBy) @Html.DropDownListForFor(m => m.OrderBy, Model.OrderList, "-- Order By --")  } @Html.PagedListPager(Model.Products, page => Url.Action("Products", new { orderBy = Model.OrderBy, page, pageSize = Model.PageSize })) Showing @Model.Products.FirstItemOnPage to @Model.Products.LastItemOnPage of @Model.Products.TotalItemCount Products 

要修复页面链接,您需要将OrderBy参数传递给视图。 最简单的方法是使用ViewBag。 在你的控制器中:

 [HttpGet] public ActionResult Products(int? OrderBy, int page = 1, int pageSize = 2) { ViewBag.OrderBy = OrderBy; ... 

在你看来:

 @Html.PagedListPager(Model, page => Url.Action("Products", new { page, pageSize = Model.PageSize, OrderBy = ViewBag.OrderBy })) 

另一种方法是使用视图模型。 创建一个名为ProductsViewModel的类,并在控制器中填充其属性,如下所示:

 List modelasc = new PagedList(listProductsasc, page, pageSize); var viewModel = ProductsViewModel(); viewModel.Products = modelasc; viewModel.OrderBy = OrderBy; return View(viewModel); 

并在视图中使用它们:

 @model FypStore.Models.ProductsViewModel ... @Html.PagedListPager(Model, page => Url.Action("Products", new { page, pageSize = Model.Products.PageSize, OrderBy = Model.OrderBy })) 

而且我怎样才能使这个pageSize = 6成为动态?

您可以使用与OrderBy参数相同的方式执行此操作:创建名为pageSize的下拉列表:

 
Page size: @Html.DropDownList("pageSize", new List { new SelectListItem{ Text="2", Value = "2" }, new SelectListItem{ Text="3", Value = "3" } }, "-- Page Size --")

附注 :您可能想要删除.ToList(); 您在控制器中查询的一部分并将其移动到其他位置。 因为现在您的代码从数据库中获取所有数据,然后对其进行排序并提取必要数量的产品。 您应始终在数据库端执行排序和分页逻辑,并仅获取要在当前页面上显示的那些产品。