我想添加一个按钮来删除Kendo分页和过滤网格(所有分页记录)中引用的所有记录,并遵循任何网格过滤器
显然,Telerik MVC扩展通过使用扩展名iqueryable
和ToDataSourceResult
参数
[DataSourceRequest] DataSourceRequest request
所做的工作
所以问题是,
IE中。我可能有一个包含1000条记录(每页10条)的分页网格,按productId过滤,能够创建一个名为“全部删除”的自定义工具栏按钮,删除所有匹配的过滤记录 < / p>
请注意,我可以使用工具栏按钮,但是我不确定telerik是否允许您以可能使这个可行的方式访问iqueriable和DataSourceRequest机制
将我指向正确的方向就足够了
更新
因为我实际上处理数百万条记录服务器端解决方案会更好
答案 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>