如何在用户单击表标题时对List <t>进行排序?</t>

时间:2009-02-12 15:16:42

标签: c# asp.net asp.net-mvc sorting

我正在编写一个asp.net mvc应用程序,我得到一个显示在表格中的服务调用列表。当用户单击表头时,我想告诉我的控制器按该列对列表进行排序。

public ActionResult Index(int? page, string sortBy, string sortDirection)
    {
        int pageIndex = page == null ? 0 : (int)page - 1;

        IServiceCallService scService = new ServiceCallService();
        IPagedList<ServiceCall> serviceCalls = scService.GetOpenServiceCalls("").ToPagedList(pageIndex, 2);

        return View("List", serviceCalls);
    }

如何合并sortBy和sortDirection。我想我可以这样做:

IPagedList<ServiceCall> serviceCalls = sc.Service.GetOpenServiceCalls("").OrderBy(sortBy).ToPagedList(pageIndex, 2);

但这不起作用,因为我假设OrderBy想要像p =&gt;这样的lambda。 p.CreateDate但不知道如何做到这一点。

我知道我可以做到的但是他们很难看,而且我确信C#在这里有一些简单的东西,我只是缺席了。

感谢。

3 个答案:

答案 0 :(得分:4)

不要忘记方便花花公子的DataBinder:

var serviceCalls = sc.Service.GetOpenServiceCalls("").OrderBy(call => DataBinder.Eval(call, sortBy));
return serviceCalls.ToPagedList(pageIndex, 2);

来自Msdn docs的DataBinder.Eval

  

使用反射来解析和评估   一个数据绑定表达式再次   对象在运行时。

答案 1 :(得分:0)

在对通用列表进行排序时,您可以提供比较排序与List<T>.Sort()重载的方法:

public void Sort(
    Comparison<T> comparison
)

Here是来自MSDN的示例。 Comparison<T>比较是一个委托,它提供了在排序时比较对象的方法。

我可能错了,但我相信如果您的列表只包含相同类型且该类型实现IComparable的项目,则可能没有必要委托。

答案 2 :(得分:0)

如果您只是想对列表进行排序,您还可以使用杠杆jQuery并使用类似Table Sorter的内容。这也是实时和所有的ajax-y。