2013-07-26 5 views
4

Я видел эту проблему во многих местах, но я не могу найти решение. Поэтому я определил сетку Kendo с CRUD-операциями, что предыдущие запущенные операции снова запущены. Скажите, что вы удаляете запись X, а затем добавляете запись Y, срабатывает операция создания, после чего снова выполняется операция удаления (для X - которая была удалена). То же самое, если вы сначала создаете элемент, а затем редактируете другой, редактируете второй элемент, а затем повторно запускаете первый оператор create и вставляете дубликат для первого вставленного элемента. Если вы включаетесь с несколькими операциями, кошмар происходит со всеми другими предыдущими операциями, которые запускаются и отправляются на контроллер.Kendo UI Grid Fire срабатывает 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, вы должны вернуть запись с идентификатором, отличным от значения по умолчанию. Для обновлений вы также должны вернуть элемент, чтобы удалить грязный флаг. – OnaBai

+0

Как это сделать? Я имею в виду, что в случае обновления мне нужно сделать еще один запрос, чтобы получить обновленную строку данных и передать ее как json? - как в READ? также, должен ли я инициализировать что-то в полном событии? и как насчет в случае удаления? .. Дело в том, что у меня есть другой метод создания решеток, который является динамическим .. и в худшем случае я переделаю сетку (ы), о которой идет речь (у меня есть 4-5 сетки выполняются «вручную», а еще 20 - что-то сделано динамично), как это .. но эти действия также возвращают ОК - он используется динамически. только разница в том, что они находятся в контроллере api. – Vlad

+1

@OnaBai: для обновлений вам не нужно возвращать элемент, возвращая только идентификатор отредактированного элемента в качестве тела ответа. –

ответ

3

Я исправил проблему, после того, как предложение OnaBai о возврате объекта Обновлено/Создано, а в случае удаления я вернул идентификатор удаленной записи.

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

только одно упоминание: в случае Создании, метод не похоже на работу, так что я сделал это в .complete случае СОЗДАТЬ операции я сделал ipGrid.dataSource.read() ; ipGrid.refresh(); - поэтому операция не повторяется. (Я читал, что в этом случае может возникнуть проблема с определением модели - установка поля ID, но я установил его). Большое спасибо OnaBai