如何从Kendo分页和过滤网格中删除所有记录(在控制器中)

时间:2014-07-03 06:13:05

标签: c# asp.net-mvc telerik

我想添加一个按钮来删除Kendo分页和过滤网格(所有分页记录)中引用的所有记录,并遵循任何网格过滤器

显然,Telerik MVC扩展通过使用扩展名iqueryableToDataSourceResult参数

来抽象它在控制器上使用[DataSourceRequest] DataSourceRequest request所做的工作

所以问题是,

  • 是否有可能以某种方式创建自定义控制器操作和关联的前端代码以通过当前的过滤方式
  • 然后可以在操作中删除与该过滤相关联的所有记录

IE中。我可能有一个包含1000条记录(每页10条)的分页网格,按productId过滤,能够创建一个名为“全部删除”的自定义工具栏按钮,删除所有匹配的过滤记录 < / p>

请注意,我可以使用工具栏按钮,但是我不确定telerik是否允许您以可能使这个可行的方式访问iqueriable和DataSourceRequest机制

将我指向正确的方向就足够了

更新

因为我实际上处理数百万条记录服务器端解决方案会更好

2 个答案:

答案 0 :(得分:1)

我对kendo mvc包装器不是很熟悉,但最后帮手会产生html和javascript。您可以为此类行为编写自定义JavaScript逻辑。

如果您使用服务器端分页,排序,过滤到客户端,则只有当前可见的项目。您可以随时访问数据项,因此添加一些按钮并附加点击事件。在事件处理程序中获取数据,获取id和make(ajax)调用某些需要收集id和删除项的操作。在ajax调用完成后,成功调用dataSource.read();

示例:

<强> CSHTML:

<button id="btnDelete">Delete all visible</button>

@(Html.Kendo().Grid<MyModel>().Name("GridId"))
// ... other grid settigns

<script>
    $('#btnDelete').on('click', function () {
        // Add some js confirmation here. confirm( ... )

        // Get the grid and data for current page/filter/sort
        // The data will contain only the currently visible items
        var grid = $('#Grid').data('kendoGrid');
        var data = grid.dataSource.data();

        var ids = [];
        for (var i = 0, len = data.length; i < len; i += 1) {
            ids.push(data[i].Id);
        }

        // Ajax call to Action that gets collection of ids and deletes items
        // On success call grid.dataSoruce.read();
    });
</script>

如果您不使用服务器端操作,也许可以通过jQuery选择器访问ID。

$('#Grid tr[role=row] td[role=gridcell]:first-of-type') // if the id is the first td

希望这可以帮助你:)


编辑:

好的,如果您不使用服务器端操作,可以使用 grid.dataSource.view() //获取当前可见的项目

实际上,如果使用服务器端操作,也可以使用view()方法而不是data()

答案 1 :(得分:1)

好的,我不知道是否有更好的解决方案,但我找到了这个。我不假装它是完美的。

您可以使用自定义按钮构思并附加点击事件。 在单击事件处理程序中,您必须从数据源中提取所需内容(过滤器,排序等)。可以从JavaScript dataSourceo对象中提取所有DataSourceRequest类属性:

dataSource.sort() dataSource.filter(), dataSource.group(),
dataSource.aggregate(), dataSource.page(), dataSource.pageSize()

您必须使用特定于kendo的方法提取它们,将它们格式化为表单数据(json在我的情况下不起作用,我不知道原因:()),通过ajax将它们发送到控制器,在控制器中根据DataSourceRequest请求编写服务器端逻辑。

<强>脚本:

function deleteAllEventHandler(){
   var dataSource = $('#Grid').data('kendoGrid').dataSource;

   var dataSourceRequest = dataSource.transport.parameterMap({
        sort: dataSource.sort(),
        filter: dataSource.filter(),
        group: dataSource.group(),
        aggregate: dataSource.aggregate(),
        page: dataSource.page(),
        pageSize: dataSource.pageSize()
   });

   var data = "";

   for (var key in dataSourceRequest) {
       if (dataSourceRequest[key] !== undefined) {
           data += key + "=" + dataSourceRequest[key] + "&";
       }
   }

   $.ajax({
        type: "POST",
        contentType: "application/x-www-form-urlencoded; charset=UTF",
        url: "@Html.Action("DeleteAllAction", "MyController")",
        data: data,
        success: function(){
            dataSource.read();
        }
   });
}

<强>控制器:

public ActionResult DeleteAll([DataSourceRequest] DataSourceRequest request)
{
    // Here you must parse the request to expression tree with custom logic
    // or use the folliwng logic:

    // It's very important to return IQueryable here so you can apply kendo
    // filters without fetching all data from the dataprovider (sql server)
    var items = YourDataProvider.GetQueryableItems();

    // Applying the kendo filters on your queryable.
    // I don't know if there is a better way but I use this one. 
    var result = items.ToDataSourceResult(); 

    // Delete items
    YourDataProivder.DeleteItems(result.Data);

    // return Success 
    return new HttpStatusCodeResult(200);
}

我仍然认为客户端提取ID并仅将它们发送到服务器以进行删除是一种更好的解决方案,但如果它适合您的情况或者具有更好的性能等,请随意使用此方法。祝您好运。< / p>