【问题标题】:TelerikMvcExtensions Grid filter when using ViewModelsTelerikMvcExtensions 使用 ViewModel 时的网格过滤器
【发布时间】:2014-10-28 15:12:06
【问题描述】:

我正在尝试找出过滤网格的最简单方法。

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

我在 View 中使用 ViewModels,在 Controller 中使用 DomainModels。我使用 AutoMapper 在它们之间进行映射。 问题是 Telerik 网格不是为 ViewModel 设计的,所以过滤器逻辑搞砸了:(

[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);
}

如何将MyViewModelFilterDescriptors 映射到MyModel

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

【问题讨论】:

    标签: c# lambda telerik-grid telerik-mvc


    【解决方案1】:

    您可以从控制器返回所有记录,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);
    }
    

    【讨论】:

    • 那只会做客户端过滤。因此,要使其正常工作,我必须将整个列表发送给无法正常工作的客户。
    • 如果您要从 db 中获取所有记录,然后尝试使用 .Where(command.FilterDescriptors) 手动应用过滤,那么我认为不会有太多的性能提升。所以我还是宁愿返回所有记录,让网格自己处理过滤逻辑,以避免复杂性。
    • _repository.Get() 应该是 _repository.AsQueriable()。更正了帖子。所以它在数据库上被过滤。
    猜你喜欢
    • 2012-03-26
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多