没有网格的MVC3分页和排序?

时间:2011-07-26 12:25:27

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

我想知道是否可以使用@foreach Razor语法而不是使用特定的网格控件来实现数据的分页和排序。

难以实施吗?我应该坚持使用现有的网格解决方案,例如WebGrid或MVCContrib网格吗?

4 个答案:

答案 0 :(得分:2)

我为pagin my lists写了一个扩展方法:

public static class DataPager
    {
        public static IEnumerable<T> PageData<T>(this IEnumerable<T> source, int currentPage, int pageSize)
        {
            var sourceCopy = source.ToList();

            if (sourceCopy.Count() < pageSize)
            {
                return sourceCopy;
            }

            return sourceCopy.Skip((currentPage - 1) * pageSize).Take(pageSize);
        }
    }

可能对你有用,例如

    var courses = List<Courses>(); // Get courses somehow...

    int currentPage = 2;
    int pageSize = 5;

var pagedCourses = courses.OrderBy(c => c.Course.Title).PageData(currentPage, pageSize);

答案 1 :(得分:2)

杰森回答的重要提示。

您不应该使用ToList方法,因为它会对内存消耗和整体性能产生负面影响。

在使用扩展方法Skip和Take之前,您还应检查IEnumerable对象是否确实是IQueryable并将其强制转换为后一种类型。这将确保Query提供程序将负责生成适当的sql以从数据库中进行选择,而不是迭代所有记录。

答案 2 :(得分:1)

如果您使用LINQ,则可以使用OrderByThenBy方法进行排序,使用SkipTake方法进行分页。如果您在存储库中执行此操作,或在ControllerIQueryable执行此操作,则可以确保仅撤回所需数据,而不是全部拉出然后排序。

答案 3 :(得分:1)

我不认为OP要求服务器端代码。 您可以使用tablesorter进行排序。 对于分页,我建议在URL上附加页码并限制服务器端的数据。