在MVC视图页面中对List 对象进行排序
我有一个ShoeItem
类,我存储了一些Shoe
属性,如Model
, Price
, Color
..
在我的ShoeController
的Index
视图中,我向用户显示了他/她使用某些filter请求的shoes
List
,这里没有问题。
该列表显示在默认的MVC 3.0列表视图中。我的视图页面的@Model
(“Index.cshtml”)的类型为List
但是,我希望用户能够根据升序或降序的属性对结果列表进行排序,但我不能..
我尝试通过在Ajax.BeginForm
发送List
作为参数来调用ShoeController
的PartialViewResult
,将ShoeController
排序回来并显示具有此排序列表的PartialView
,但List参数作为null来到控制器。
我也试过jQuery来做客户端的排序,但是我无法从jQuery到达List
对象。如果你想看,我可以发布代码,但它很简单..
有任何想法吗?
有2个选项
- 向服务器发出一个AJAX请求,传递排序参数,例如
/shoes/?sort=model&dir=asc
。 将这些参数传递给控制器操作,检索项目,对它们进行排序并返回JsonResult。 通过JavaScript呈现新列表。 - 使用sort params向服务器发出AJAX /完整页面请求。 将这些参数转换为控制器操作,检索项目并返回PartialView for AJAX和ViewResult以获取整页请求。
当您从2个不同的位置(服务器和客户端)进行渲染时,第一种方法难以维护。 虽然使用像胡子这样的模板库可以使这更容易: https : //github.com/janl/mustache.js 。
对于第二个选项,您的控制器将如下所示。 我已经做了一些假设,它可能会简化,但有帮助它会让你开始。 如果您的鞋子存储在数据库中,请确保对IQueryable进行过滤和排序 – 数据库服务器将这样做,而不是将数据返回到.NET,然后对其进行过滤。
public ViewResult Index(int? colour, string sort, string dir) { IQueryable shoes = shoeService.GetAllShoes(); // Filter by something if(colour.HasValue) shoes = shoes.Where(s => s.Colour = colour); // Order the items switch((sort ?? "").ToLower()) { case "colour": if(dir == "desc") shoes = shoes.OrderByDescending(s => s.Colour.Name); else shoes = shoes.OrderBy(s => s.Colour.Name); break; } if(Request.IsAjaxRequest()) return PartialView(shoes.ToList()); return View(shoes.ToList()); }