2013-07-26 52 views
4

我在很多地方看到过这个问题,但似乎找不到解决方案。所以我定义了一个带有CRUD操作的Kendo网格,事情是之前被解雇的操作再次被解雇。 假设您删除条目X,然后添加条目Y,创建操作将触发,之后删除操作(对于已删除的X)将再次触发。如果你先创建一个元素然后编辑另一个元素,那么它也是同样的事情,它编辑第二个元素,然后重新触发第一个create语句并插入第一个插入元素的副本。如果您继续进行多项操作,则会发生所有其他先前操作被触发并发送给控制器的恶梦。Kendo UI Grid多次触发CRUD操作

我网格是:

function InitializeIPAddressesGrid(userID) { 
    selectedUserID = userID; 
    $(".ipAddresses").kendoGrid({ 
     dataSource: IPAdressesDataSource, 
     sortable: { 
      mode: "single", 
      allowUnsort: false 
     }, 
     remove: function (e) { 
      this.refresh(); 
      var canDelete = confirm("Are you sure you want to delete this record?"); 
      if (!canDelete) { 
      e.preventDefault(); 
      } 

     }, 
     height: 420, 
     resizable: true, 
     pageable: { 
      refresh: true, 
      pageSize: 10 
     }, 
     selectable: "row", 
     toolbar: ["create"], 
     editable:{mode: "inline", confirmation:false} , 
     columns: [{ 
      field: "IpAddress", 
      title: "IP Address" 
     }, 
     { 
      field: "Status", 
      title: "Status" 
     }, 
     { 
      field: "LockedUntil", 
      title: "Locked until", 
      template: "#=kendo.toString(LockedUntil, 'yyyy/MM/dd')#" 
     }, 
      { command: ["edit", "destroy"], title: " ", width: "180px" } 
     ] 
    }); 

} 
var IPAdressesDataSource = new kendo.data.DataSource({ 
    type: "json", 
    serverPaging: true, 
    serverSorting: true, 
    serverFiltering: true, 
    pageSize: 10, 
    //scrollable:false, 
    transport: { 
     read: { 
      url: websiteRootUrl + '/PortalAuthorization/GetIPAddressesList', 
     }, 
     update: { 
      url: websiteRootUrl + "/PortalAuthorization/UpdateIP", 
      dataType: "json", 
      type: 'POST', 
      complete: function (e) { 
          if (e.status != 200) { 
           alert(eval('(' + e.responseText + ')').Message); 
          } 
          } 
      }, 
     create: { 
       url: websiteRootUrl + "/PortalAuthorization/CreateIP", 
       dataType: "json", 
       type: 'POST', 
       complete: function (e) { 
           if (e.status != 200) { 
            alert(eval('(' + e.responseText + ')').Message); 

           } 
           } 
       }, 
     destroy: { 
      url: websiteRootUrl + "/PortalAuthorization/DeleteIP", 
      dataType: "json", 
      type: 'DELETE', 
      complete: function (e) { 
          if (e.status != 200) { 
           alert(eval('(' + e.responseText + ')').Message); 
          } 
          } 
     }, 

     parameterMap: function (options, operation) { 

      if (operation == "update" && options) { 
       return {ipAddress: options.IpAddress , 
         status: options.Status , 
         lockedUntil: kendo.toString(options.LockedUntil, 'yyyy/MM/dd'), 
         pkey: options.ID, 
         databaseID: selectedDatabaseID }; 
      } 
      else 
      if (operation == "destroy" && options) 
      { 
       return { 
         databaseID: selectedDatabaseID, 
         pkey: options.ID, 
         userIDParam: selectedUserID 
         }; 
      } 
      else 
      if (operation == "create" && options) { 
       return {ipAddress: options.IpAddress , 
         status: options.Status , 
         lockedUntil: kendo.toString(options.LockedUntil, 'yyyy/MM/dd'), 
         pkey: options.ID, 
         userIDParam: selectedUserID, 
         databaseID: selectedDatabaseID }; 
      } 
      else 
      { 
      options.databaseID = selectedDatabaseID; 
      options.userID = selectedUserID; 
      return options; 
      } 
     } 
    }, 
    schema: { 
     model: { 
       id: "ID", 
       fields: { 
         IpAddress: { type: "string" }, 
         Status: { type: "string" }, 
         LockedUntil: { type: "date" } 
       } 
      },  
     data: function (data) { 
      return data.Items; 
     }, 
     total: function (data) { 
      return data.TotalCount; 
     } 
    } 
}); 

我的控制器:

public object UpdateIP(int databaseID, long pkey, string status, string lockedUntil, string ipAddress) 
    { 
      var database = [...]; 
     DynamicDataRepository repository = [...]; 
     string query = "..."; 

      repository.ExecuteNonQuery(query); 

     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

    public object DeleteIP(int databaseID, long pkey, int? userIDParam) 
    { 
     var database = [...]; 
     DynamicDataRepository repository = [...]; 
     string query = "..."; 

      repository.ExecuteNonQuery(query); 

     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

    public object CreateIP(int databaseID, long? pkey, string status, string lockedUntil, string ipAddress, int? userIDParam) 
    { 
     var database = [...]; 
     DynamicDataRepository repository = [...]; 
     string query = "..."; 

      repository.ExecuteNonQuery(query); 

     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

你有任何IDEEA?我做错了什么?提前致谢。附:控制器中的查询工作正常。

+4

如果创建不够,返回OK,您应该返回具有与默认值不同的ID的记录。对于更新,您还应该返回元素以便删除脏标志。 – OnaBai

+0

我该怎么做?我的意思是,在更新的情况下,我必须进行另一个查询来获取更新的数据行并将其作为json传递给它? - 像在读?另外,我应该在整个事件中初始化一些东西吗?在删除的情况下呢?..事情是我有另一种创建网格的方法,这是动态的..最坏的情况下,我会重做有问题的网格(我喜欢4-5网格完成“手动”和另外20个动态地完成的事情)就像那样..但是这些动作也返回OK - 使用的动态。唯一的区别是它们在api控制器中。 – Vlad

+1

@OnaBai:对于更新,您不必返回元素,只返回已编辑元素的ID作为响应正文就足够了。 –

回答

3

我解决了这个问题,接着OnaBai建议返回更新/创建的实体,而在删除的情况下,我返回了删除条目的ID。

public object UpdateIP(int databaseID, long pkey, string status, string lockedUntil, string ipAddress) 
    { 
     var database = [...]; 
     DynamicDataRepository repository = [...]; 
     string query = [...]; 

     IPList updatedIP = new IPList { ID = pkey, IpAddress = ipAddress, Status = status, LockedUntil = DateTime.Today }; 

     return Json(updatedIP, JsonRequestBehavior.AllowGet); 

     // return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

只有一个提到:在的情况下创建,方法似乎没有工作,所以我所做的就是在创建操作我做了ipGrid.dataSource.read的.complete事件() ; ipGrid.refresh(); - 所以操作不会重复。 (我在这种情况下读到,模型定义可能有问题 - 设置ID字段 - 但我确实设置了该字段)。非常感谢OnaBai