尝试插入和删除详细信息kendo网格时的错误行为

时间:2013-12-01 08:58:07

标签: kendo-ui kendo-grid kendo-asp.net-mvc

我有master和详细信息kendo grid,当我插入/删除标题时一切正常,但是当我尝试在详细信息网格中插入多个记录时,create语句将循环显示所有插入的记录(新旧每次我尝试添加新记录时,当我尝试从详细信息表中删除记录时,视图将调用create方法而不是删除记录。

 @(Html.Kendo().Grid(Model.ItemSuppliers)
    .Name("CreateItem_gridSuppliers")
    .Columns(columns =>
    {
        columns.Bound(p => p.ItemCode).Title(MyResources.GridItemCode).Width(100);            
        columns.ForeignKey(p => p.SupplierID, Model.Suppliers, "SupplierID", "SupplierID").Title(MyResources.Supplier).Width(200).EditorTemplateName("SupplierForeignkeyEditor");        
        columns.Bound(p => p.SupplierNameE).Title(MyResources.SupplierNameE).Width(150);                      
        columns.Bound(p => p.CustomDutyPercentage).Title(MyResources.CustomDutyPercentage).Width(200);
        columns.Bound(p => p.CustomDutyRate).Title(MyResources.CustomDutyRate).Width(200);

        columns.Command(command => { command.Edit().Text(MyResources.EditText).UpdateText(MyResources.UpdateText).CancelText(MyResources.CancelText); command.Destroy().Text(MyResources.Delete); }).Width(170);
    })
    .ToolBar(toolBar =>
    {
        toolBar.Create().Text(MyResources.AddNewItem);
    })

                     .Events(e => e.Edit("gridEdit").Cancel("OnCancel").DataBound("CreateItem_gridSuppliers_GridDataBound").Change("ItemSupplierSaved"))
    .Editable(editable => editable.Mode(GridEditMode.InLine))
           .ClientDetailTemplateId("template")

    .DataSource(dataSource => dataSource
        .Ajax()
        .PageSize(5)
        .ServerOperation(true)
                                        .Events(events => events.Error("gridErrorHandler"))
                                .Events(ev => ev.RequestEnd("ItemSupplierSaved"))
        .Model(model =>
        {
            model.Id(p => p.ItemSuppliersID);
            model.Field(p => p.ItemSuppliersID).Editable(false);
            model.Field(p => p.ItemCode).Editable(false);

        })
                                        .Read(read => read.Action("GetItemSuppliers", "Item", new { __cnv = Model.ConversationKey }))
                             .Update(update => update.Action("ItemSupplier_Update", "Item", new { __cnv = Model.ConversationKey }))
                             .Create(create => create.Action("ItemSupplier_Create", "Item", new { __cnv = Model.ConversationKey }))
                                             .Destroy(destroy => destroy.Action("ItemSupplier_Delete", "Item", new { __cnv = Model.ConversationKey }))
    ))
  <script id="template" type="text/kendo-tmpl">
      @(Html.Kendo().Grid(Model.ItemOrigins)
                        .Name("ItemOrigin_#=ItemSuppliersID#")
                        .Columns(columns =>
                        {
                            columns.Bound(p => p.ItemCode).Hidden();
                            columns.Bound(p => p.ItemSuppliersID).Title(MyResources.ItemSuppliersID).Width(120);
                            columns.Bound(p => p.ItemOriginID).Title(MyResources.ItemOriginID).Width(100);

                            columns.ForeignKey(p => p.OriginID, Model.Origins, "OriginID", "OriginNameE").Title(MyResources.OriginID).Width(100);

                            columns.Bound(p => p.ProductBarCode).Title(MyResources.ProductBarCode).Width(200); 
                            columns.Command(command => { command.Edit().Text(MyResources.EditText).UpdateText(MyResources.UpdateText).CancelText(MyResources.CancelText); command.Destroy().Text(MyResources.Delete); }).Width(190);
                        })
                        .ToolBar(toolBar =>
                        {
                            toolBar.Create().Text(MyResources.AddNewItem);
                        })
                        .Events(e => e.Edit("RemoveItemOriginFilter").Cancel("ReloadGrid"))
                        .Editable(editable => editable.Mode(GridEditMode.InLine).DisplayDeleteConfirmation(true).DisplayDeleteConfirmation(MyResources.ItemOriginDeleteConfirm))

                        .DataSource(dataSource => dataSource
                            .Ajax()
                            .PageSize(5)
                            .ServerOperation(true)

                                    .Events(events => events.Error("gridErrorHandler"))
                            .Model(model =>
                            {
                                model.Id(p => p.ItemOriginID);
                                model.Field(p => p.ItemOriginID).Editable(false);
                                model.Field(p => p.ItemSuppliersID).Editable(false);
                                model.Field(p => p.Origin);

                            })
                                                    .Read(read => read.Action("GetItemOrigin", "Item", new { itemSupplierID = "#=ItemSuppliersID#", __cnv = Model.ConversationKey }))
                                            .Update(update => update.Action("ItemOrigin_Update", "Item", new { itemSupplierID = "#=ItemSuppliersID#", __cnv = Model.ConversationKey }))
                                            .Create(create => create.Action("ItemOrigin_Create", "Item", new { itemSupplierID = "#=ItemSuppliersID#", __cnv = Model.ConversationKey }))
                                            .Destroy(destroy => destroy.Action("ItemOrigin_Delete", "Item", new { itemSupplierID = "#=ItemSuppliersID#", __cnv = Model.ConversationKey }))
                            )
                            .ToClientTemplate()
                        )
</script>

这是我的控制器

[AcceptVerbs(HttpVerbs.Post)]
 public ActionResult ItemOrigin_Create([DataSourceRequest] DataSourceRequest request, ItemOriginViewModel item, int itemSupplierID, string __cnv)
{
     List<ItemOriginViewModel> itemOrigins = new List<ItemOriginViewModel>();
     if (Session["ItemOrigin_" + __cnv + itemSupplierID] != null)
        {
            itemOrigins = (List<ItemOriginViewModel>)Session["ItemOrigin_" + __cnv + itemSupplierID];

       if (item.UID == null)
        {
            item.UID = Guid.NewGuid().ToString();
             item.ItemSuppliersID = itemSupplierID;
             itemOrigins.Add(item);
         }
          else
         {
               int index = itemOrigins.FindIndex(x => x.UID == item.UID);
               itemOrigins[index] = item;
          }
     }
     else
     {
         item.UID = Guid.NewGuid().ToString();
         item.ItemSuppliersID = itemSupplierID;
         itemOrigins.Add(item);
     }
     Session["ItemOrigin_" + __cnv + itemSupplierID] = itemOrigins;     
      return Json(itemOrigins.ToDataSourceResult(request));            
  }



[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ItemOrigin_Delete([DataSourceRequest] DataSourceRequest request, ItemOriginViewModel item, string __cnv)
        {
            List<ItemOriginViewModel> itemOrigins = (List<ItemOriginViewModel>)Session["ItemOrigin_" + __cnv + item.ItemSuppliersID];
            int index = itemOrigins.FindIndex(x => x.ItemOriginID == item.ItemOriginID);
            itemOrigins.RemoveAt(index);
            Session["ItemOrigin_" + __cnv + item.ItemSuppliersID] = itemOrigins;
            var result = itemOrigins;
            return Json(result.ToDataSourceResult(request));
        }

有任何建议请解决这个问题??

1 个答案:

答案 0 :(得分:0)

Kendo DataSource将尝试发送标记为“新”或“脏”的项目。 “新建”仅表示商品ID(看起来您的ID列为ItemSuppliersID)为undefined0。只要没有设置ID,它就会继续重新发送这些项目。

通常,您的控制器应该返回刚插入的项目,但ID现在设置为新值。然后,Kendo会将响应中的ID复制到客户端上的对象。由于随后设置了ID,该项目将不再标记为“新”,并将停止发送到服务器。

换句话说,如果你发帖:

{
    "ItemSuppliersID": 0,
    "ItemCode": "ABC"
}

然后控制器应该返回:

{
    "ItemSuppliersID": 123, // <-- ID field is now set
    "ItemCode": "ABC"
}