我在我的应用程序中使用 PagedList.MVC 进行分页。这工作正常。分页工作正常,OrderBy 下拉列表也工作正常。当我从下拉列表中选择值时,它会给出所需的排序结果。我的意思是,如果我选择 A-Z,那么它会按升序对项目进行排序,但是当我单击第二页或下一页时,它不会对任何项目进行排序,并且 url 会变成这样
http://localhost:41213/Home/Products?page=2&pageSize=6
还有我怎样才能使这个 pageSize=6 成为动态的?我希望将其放入 {5,10,15,20} 之类的下拉列表中,当用户选择一个值时,它应该显示所选的项目数。
Controller
[HttpGet]
public ActionResult Products(int? OrderBy, int page=1, int pageSize=6)
{
private Shopping db = new Shopping();
switch (OrderBy)
{
case 1:
List<Product> listProductsasc = db.Products.OrderBy(p => p.Name).ToList();
PagedList<Product> modelasc = new PagedList<Product>(listProductsasc, page, pageSize);
return View(modelasc);
case 2:
List<Product> listProductsdesc = db.Products.OrderByDescending(p => p.Name).ToList();
PagedList<Product> modeldesc = new PagedList<Product>(listProductsdesc, page, pageSize);
return View(modeldesc);
default:
List<Product> listProducts = db.Products.ToList();
PagedList<Product> modeldefault = new PagedList<Product>(listProducts, page, pageSize);
return View(modeldefault);
}
}
查看
@model PagedList.IPagedList<FypStore.Models.Product>
@using PagedList.Mvc
<div class="row">
<div class="col-sm-6">
@using (Html.BeginForm("Products", "Home", FormMethod.Get, new { id = "Form1" }))
{
<div class="col-sm-8">
Sort by:
@Html.DropDownList("OrderBy", new List<SelectListItem>
{
new SelectListItem{ Text="A-Z", Value = "1" },
new SelectListItem{ Text="Z-A", Value = "2" }
}, "-- Order By --")
</div>
<div class="col-sm-4">
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="Filter" />
</div>
</div>
</div>
}
</div>
</div>
<br />
@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;
在返回 View 之前。然而,更好的方法是使用包含 View 使用的属性的 View 模型,这将解决代码的其他问题(例如,如果您选择 "Z-A"
选项并提交表单,当您返回它,集合已排序,但下拉列表显示 "-- Order By --"
表示其未排序。您的 View 模型应该是
public class ProductsVM
{
[Display(Name = "Sort by:")]
public int? OrderBy { get; set; }
public IEnumerable<SelectListItem> OrderList { get; set; }
public int Page { get; set; }
public int PageSize { get; set; }
PagedList<Product> Products { get; set; }
}
Controller 方法是
[HttpGet]
public ActionResult Products(int? orderBy, int page=1, int pageSize=6)
{
private Shopping db = new Shopping();
IEnumerable<Product> 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<SelectListItem>
{
new SelectListItem{ Text="A-Z", Value = "1" },
new SelectListItem{ Text="Z-A", Value = "2" }
},
Page = page,
PageSize = pageSize,
Products = new PagedList<Product>(products, page, pageSize);
};
return View(model);
}
最后修改 View 以使用 View 模型
@model ProductsVM
....
@using (Html.BeginForm("Products", "Home", FormMethod.Get))
{
@Html.LabelFor(m => m.OrderBy)
@Html.DropDownListForFor(m => m.OrderBy, Model.OrderList, "-- Order By --")
<input type="submit" class="btn btn-default" value="Filter" />
}
@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
关于c# - Mvc Asp 排序项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34188388/