使用Telerik MVC Extensions Grid在数据库服务器上进行分页

时间:2011-10-17 12:48:59

标签: asp.net-mvc telerik

Telerik mention此功能:

  

基于Linq的表达式引擎,用于将网格操作(分页,排序,过滤和分组)推送到数据库服务器

但是如何启用呢?这些例子都是IEnumerable的东西。

2 个答案:

答案 0 :(得分:2)

这取决于您如何将数据发送到视图。如果将linq查询保留为延迟求值,那么您将在数据库上进行分页。但是,如果您在数据层中执行ToList()或其他枚举,那么您将错过所有数据,并且必须设置一些内容以手动对其进行分页。

更好地展示......

// In your initial page load
public ActionResult Index()
{
    return View(new MyViewModel
    {
        // ... other view data

        // set order or .Where for initial load, but don't use .ToList or enumerate
        MyObjects = _db.MyObjects.OrderBy(m => m.Name)
        // When this is passed into the grid, it will finalize the paging there
        // and when the grid enumerates MyObjects, it will only pull the relevant
        // items from the database.
    });
}

如果你正在使用ajax绑定......

// In an ajax grid responder action
[GridAction]
public ActionResult AjaxGridAction()
{
    // Assuming _db is a CodeFirst DbContext, GridModel will handle filtering,
    // paging, and sorting in the database as linq applies those methods to the
    // IQueryable _db.MyObjects
    return View(new GridModel(_db.MyObjects));
}

如果您正在使用存储库模式(尽管DbContext确实已经是存储库),那么让它返回延迟对象:

public IEnumerable<T> GetMyObjects()
{
    // Don't use ToList or enumerate them in your repository - that will
    // pull all the data before the Telerik grid has filtered it.
    return _db.MyObjects;
}

即使所有内容都绕过IEnumerable,当实际迭代集合时,具体类型(上例中的DbSet)将实际处理它。

如果您正在使用类似AutoMapper的东西,请注意在映射过程中意外拉出所有记录非常容易。 AutoMapper 2有一个解决方案,可以在没有迭代的情况下从数据库中进行投影,但还没有文档。我一直在使用this solution for that,直到我有时间调查AutoMapper 2。

_db.MyObjects.Project().To<MyObjectsViewModel>();

基本上包装自动项目属性而不是这样做:

_db.MyObjects
    .Select(o => new MyObjectsViewModel { // manually map properties, ewww });

答案 1 :(得分:0)

对于服务器分页/订购,您应该设置 GridOperationMode.Server prop。

有一个使用样本:

Html.Telerik().Grid<PartnerUserViewModel>()
    .Name("Grid").DataBinding(binding =>    binding.Ajax().OperationMode(GridOperationMode.Server).Select("GetUsers", "Partner")).Columns(columns =>
    {
        columns.Bound(o => o.Representer).Title("Representer");  
    });          
    .Sortable(sorting => sorting.OrderBy(sortOrder => sortOrder.Add(p => p.DateCreated).Descending()))
    .Filterable()
    .Pageable(pager => pager.Position(GridPagerPosition.Both).PageSize(5))
    .Groupable()