2014-10-28 43 views
1

我想弄清楚过滤网格的最简单方法。TelerikMvcExtensions使用ViewModels时的网格过滤器

@Html.Telerik().Grid<MyViewModel>() 
    .Name("Grid") 
    .Filterable(); 

我在View中使用ViewModels,在Controller中使用DomainModels。我使用AutoMapper在它们之间进行映射。 问题是Telerik的电网不旨在处理的ViewModels工作,使过滤器逻辑被搞砸:(

[GridAction(EnableCustomBinding = true)] 
public JsonResult SelectHandled(GridCommand command) 
{ 
    var items = _repository.AsQueriable() 
        .Where(command.FilterDescriptors) // <-------- this won't work 
        .Page(command.Page, command.PageSize); 

    var vms = Mapper.Map<IEnumerable<MyModel>, IEnumerable<MyViewModel>>(items); 

    var model = new GridModel 
    { 
     Data = vms, 
     Total = // omitted 
    }; 
    return Json(model); 
} 

如何映射FilterDescriptorsMyViewModelMyModel

我基本上是想实现自己的IFilterDescriptor Extension

回答

0

可以返回所有记录从控制器和Telerik的电网在其自身管理的筛选逻辑从你的代码,你可以尝试这样的:。

[GridAction(EnableCustomBinding = true)] 
public ActionResult SelectHandled(GridCommand command) 
{ 
    IEnumerable<MyViewModel> items = _repository.Get(); 

    var vms = Mapper.Map<IEnumerable<MyModel>, IEnumerable<MyViewModel>>(items); 

    var retColl = new GridModel(vms) { Total = command.PageSize * command.Page }; 
    return View(retColl); 
} 
+0

这只会做客户端过滤。所以为了工作,我不得不将整个列表发送给客户端,这是不行的。 – 2014-10-28 17:38:59

+0

如果您要从db中获取所有记录,然后尝试使用'.Where(command.FilterDescriptors)'手动应用过滤,那么我认为不会有太大的性能提升。所以我仍然希望返回所有记录,并让网格自行处理过滤逻辑,以避免复杂性。 – 2014-10-28 18:18:29

+0

'_repository.Get()'应该是'_repository.AsQueriable()'。更正了帖子。所以它在数据库上被过滤。 – 2014-10-28 19:06:55