我有一个小的剑道网格,设置如下。以一种令人难以置信的神秘方式,"添加新"的控制器动作,即BatchCreate
,只有在单击"添加新"后单击另一个命令按钮时才会被调用。例如a)点击"添加新",什么都没有发生。b)重新加载页面,点击"添加新",没有任何变化,点击"保存更改",最后调用BatchCreate
方法。
我的网格看起来像这样,几乎是直接从他们的例子中复制的:
@(Html.Kendo().Grid<LocationIndexItem>()
.Name("index-grid")
.Columns(columns =>
{
columns.Bound(p => p.Name);
columns.Bound(p => p.IsActive).ClientTemplate(
"<input type='checkbox' value='#= IsActive #' " +
"# if (IsActive) { #" +
"checked='checked'" +
"# } #" +
"/>").Width(70);
columns.Bound(p => p.Remarks);
columns.Command(cmd => cmd.Destroy());
})
.ToolBar(toolbar =>
{
toolbar.Create();
toolbar.Save();
})
//.Events(e => e.Edit("gridEdit"))
.Editable(editable => editable.Mode(GridEditMode.InCell))
.Filterable()
.Pageable()
.Scrollable()
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(false)
.Batch(true)
.PageSize(20)
.Events(events => events.Error("errorHandler"))
.Model(model => model.Id(p => p.Id))
.Read(read => read.Action("Read", "Location"))
.Update(update => update.Action("BatchUpdate", "Location"))
.Create(create => create.Action("BatchCreate", "Location"))
.Destroy(destroy => destroy.Action("BatchDelete", "Location"))
)
)
另一个网格完全相同,除了一个额外的字段,工作得很好。
JUST IN:用以下代码过滤网格似乎会导致上述行为。当我注释注释行时,$("#ParkadeId").change()
out,网格行为正常:
$(function() {
$("#ParkadeId").change(function () {
var value = $(this).val();
var grid = $("#index-grid").data("kendoGrid");
if (value) {
grid.dataSource.filter({ field: "ParkadeId", operator: "eq", value: parseInt(value) });
} else {
grid.dataSource.filter({});
}
});
//$("#ParkadeId").change();
});
似乎在剑道网格上设置过滤器会破坏添加新功能。
根据Kendo Ui Support Forum -当过滤/排序应用于客户端时,这是预期的行为,因为当新记录在当前视图之外创建时,它不能被编辑。
可能的解决方案是启用服务器排序/过滤或实现自定义"添加记录"按钮,该按钮首先清除数据源当前筛选和排序,然后使用网格API添加新记录。
这是一个函数的例子,在添加新记录之前清除当前的过滤器和排序:
function createNew() {
var grid = $("#grid").data("kendoGrid");
grid.dataSource.filter({});
grid.dataSource.sort({});
//add record using Grid API
grid.addRow();
}
我在剑道论坛找到了一个很好的解决方案:
我所做的是创建一个零过滤器,它接受主键等于零的数据(因为您刚刚添加的行主键为零),并且在任何我需要设置自定义过滤器的地方,我也只包括零过滤器:
var zeroFilter = {
field: "FieldID",
operator: "eq",
value: 0
};
function filterData() {
var ds = $("#Grid").data("kendoGrid").dataSource;
ds.filter({
logic: "or",
filters: [
{
field: "MyField",
operator: "eq",
value: someValue
},
zeroFilter
]
});
}
这可以通过自定义"create"工具栏来实现
$("#grid").kendoGrid({
...
toolbar: [{
name: "my-create",
text: "Add new record"
}],
..
)};
加载
$(".k-grid-my-create", grid.element).on("click", function(e) {
var grid = $("#grid").data("kendoGrid");
grid.dataSource.filter({});
grid.dataSource.sort({});
//add record using Grid API
grid.addRow();
});