Kendo UI Grid 多次触发 CRUD 操作

Posted

技术标签:

【中文标题】Kendo UI Grid 多次触发 CRUD 操作【英文标题】:Kendo UI Grid Fires CRUD Operations multiple times 【发布时间】:2013-07-26 20:24:28 【问题描述】:

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

我的网格是:

 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);
    

你有什么想法吗?我在哪里做错了什么?提前致谢。附言控制器中的查询工作正常。

【问题讨论】:

如果创建不够返回OK,你应该返回一个id不同于默认值的记录。对于更新,您还应该返回元素以删除脏标志。 我该怎么做?我的意思是,在更新的情况下,我是否必须进行另一个查询才能获取更新的数据行并将其作为 json 传递? - 就像在 READ 中一样?另外,我应该在完整的事件中初始化一些东西吗?那么在删除的情况下呢?..问题是我有另一种创建网格的方法,它是动态的..最坏的情况是我将重做有问题的网格(我有 4-5网格“手动”完成,另外 20 个动态完成)像这样..但这些动作也返回 OK - onse 使用动态。唯一的区别是它们在一个 api 控制器中。 @OnaBai:对于更新,您不必返回元素,仅返回已编辑元素的 Id 作为响应体就足够了。 【参考方案1】:

我解决了这个问题,按照 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);
    

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

【讨论】:

以上是关于Kendo UI Grid 多次触发 CRUD 操作的主要内容,如果未能解决你的问题,请参考以下文章

使用json的kendo ui Grid的Crud操作

kendo ui AngularJS Grid CRUD操作

调用读取后未填充 Kendo UI Grid

使用复选框选择取消选择 kendo UI Grid 的行

Angular 2 Grid dataBound 事件的 Kendo UI

如何处理 Kendo UI Grid 行双击事件