在MVC视图页面中对List 对象进行排序

我有一个ShoeItem类,我存储了一些Shoe属性,如ModelPriceColor ..

在我的ShoeControllerIndex视图中,我向用户显示了他/她使用某些filter请求的shoes List ,这里没有问题。

该列表显示在默认的MVC 3.0列表视图中。我的视图页面的@Model (“Index.cshtml”)的类型为List

但是,我希望用户能够根据升序或降序的属性对结果列表进行排序,但我不能..

我尝试通过在Ajax.BeginForm发送List作为参数来调用ShoeControllerPartialViewResult ,将ShoeController排序回来并显示具有此排序列表的PartialView ,但List参数作为null来到控制器。

我也试过jQuery来做客户端的排序,但是我无法从jQuery到达List对象。如果你想看,我可以发布代码,但它很简单..

有任何想法吗?

有2个选项

  1. 向服务器发出一个AJAX请求,传递排序参数,例如/shoes/?sort=model&dir=asc 。 将这些参数传递给控制器​​操作,检索项目,对它们进行排序并返回JsonResult。 通过JavaScript呈现新列表。
  2. 使用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()); }