1

我有一个ShoeItem类,我在其中存储一些Shoe属性,例如Model, Price, Color..

在我的Index视图中ShoeController,我使用一些过滤器向用户展示了他/她请求的用户 a Listshoes这里没有问题..

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

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

我尝试通过在中发回as 参数来调用 a PartialViewResult,将其排序回那里并使用此排序列表显示 a ,但 List 参数作为 null 到达控制器。ShoeControllerList<ShoeItem>Ajax.BeginFormPartialView

我还尝试使用 jQuery 进行客户端排序,但无法List<ShoeItem>从 jQuery 访问对象。如果您想查看,我可以发布代码,但这很简单。

有任何想法吗?

4

1 回答 1

2

有2个选项

  1. 向传递排序参数的服务器发出 AJAX 请求,例如/shoes/?sort=model&dir=asc。将这些参数带入控制器操作,检索项目,对它们进行排序并返回 JsonResult。通过 JavaScript 呈现新列表。
  2. 使用排序参数向服务器发出 AJAX/整页请求。将这些参数带入控制器操作,检索项目并返回用于 AJAX 的 PartialView 和用于整页请求的 ViewResult。

第一种方法更难维护,因为您最终会从 2 个不同的地方进行渲染 - 服务器和客户端。尽管通过使用某种模板库(如 mustache)会更容易:https ://github.com/janl/mustache.js 。

对于第二个选项,您的控制器将如下所示。我做了一些假设,它可能会被简化,但它会帮助你开始。如果您的鞋子存储在数据库中,请确保您在 IQueryable 上执行过滤和排序 - 这样数据库服务器将执行此操作,而不是将数据返回到 .NET,然后对其进行过滤。

public ViewResult Index(int? colour, string sort, string dir)
{
    IQueryable<Shoe> 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());
}
于 2012-09-13T17:08:29.300 回答