2013-08-22 3 views
1

Я использую пользовательский интерфейс Kendo с API-интерфейсом ASP.NET. Существует ProjectController, который имеет все необходимые методы.Kendo UI DataSource не запускает transport.destroy

Моя проблема заключается в том, что при нажатии на кнопку Delete, сетка Кендо UI поднимет remove() событие, но DataSource никогда не вызывает transport.destroy. Скорее, кажется, что вызывается tansport.create. В transport.parameterMap Я вижу, что операция создает вместо уничтожить.

Вот пример кода JavaScript:

$(document).ready(function() { 
    var apiUrl = '/api/projects/'; 
    var dataType = 'json'; 

    var dataSource = new kendo.data.DataSource({ 
     batch: true, 
     autoSync: false, 
     transport: { 
      read: { 
       url: apiUrl, 
       dataType: dataType, 
       type: "GET" 
      }, 
      update: { 
       url: apiUrl, 
       dataType: dataType, 
       type: "PUT" 
      }, 
      destroy: { 
       url: apiUrl, 
       type: "DELETE" 
      }, 
      create: { 
       url: apiUrl, 
       contentType: "application/json;charset=utf-8", 
       dataType: dataType, 
       type: "POST" 
      }, 
      parameterMap: function (data, operation) { 
       console.log("Operation: " + operation); 
       if (operation === "create" && data.models) { 
        for (var i in data.models) { 
         var model = data.models[i]; 

         if (model.ProjectId === 0) { 
          return kendo.stringify(model); 
         } 
        } 
       } else if (operation === "destroy") { 
        console.log("Data.Models: " + data.models); 
        console.log("Data.id: " + data.ProjectId); 
        return { id: data.ProjectId }; 
       } 

       return data; 
      } 
     }, 
     schema: { 
      id: "ProjectId", 
      model: { 
       fields: { 
        ProjectId: { type: "number", editable: false, nullable: false, defaultValue: 0 }, 
        ProjectName: { type: "string", validation: { required: true } }, 
        Status: { type: "string", validation: { required: true } }, 
        IsActive: { type: "boolean" } 
       } 
      } 
     }, 
     pageSize: 10, 
     serverPaging: false, 
     serverFiltering: false, 
     serverSorting: false 
    }); 

    $("#projectsGrid").kendoGrid({ 
     dataSource: dataSource, 
     groupable: false, 
     sortable: true, 
     pageable: { 
      refresh: true, 
      pageSizes: true 
     }, 
     pageSize: 10, 
     toolbar: ["create"], 
     editable: "popup", 
     columns: [ 
      { field: "ProjectId", width: 30, title: "ID" }, 
      { field: "ProjectName", width: 180, title: "Project" }, 
      { field: "Status", width: 90, title: "Status" }, 
      { field: "IsActive", width: 40, title: "Is Active", type: "boolean", template: '<input type="checkbox" #if (IsActive) {# checked="checked" #}# disabled="disabled" />' }, 
      { command: ["edit", "destroy"], title: "&nbsp", width: "80px" } 
     ], 

     remove: function (e) { 
      console.log("Delete button clicked."); 
      console.log("Project ID: " + e.model.ProjectId); 
      //dataSource.remove(e.model); 
      //dataSource.sync(); 
     } 
    }); 
}); 

Web API работает отлично, когда запросы выполняются с помощью Fiddler, но Кендо UI Сетка показывает:

POST http://localhost:port/api/Projects 

, когда он должен быть DELETE.

Спасибо всем заранее!

ответ

6

На вашем источнике данных у вас установлен флаг , установленный в true, это означает, что источник данных отправит вызов только после того, как вы сообщите об этом, например, вызовите sync(). http://docs.kendoui.com/api/framework/datasource#configuration-batch

Как

Убедитесь, что вы определили Id в модели, как описано здесь Why does the KendoUI Grid Transport Create event gets raised multiple times, and even when the action is Update? OnaBai, ваш идентификатор вне модели, должны быть:

model: { 
     id: "ProductID", 
     fields: { 
      ProductID: { editable: false, nullable: true }, 
     } 
    } 
+0

На самом деле это не тот случай. Я вижу, что вызывается обращение к веб-API (независимо от того, я вызываю 'sync()' или если для параметра autoSync установлено значение true. Я попытался установить пакетное значение в false, но это вызвало еще одну проблему с 'transport.create Проблема заключается в том, что удаление не вызывает 'transport.destroy'. Он продолжает поднимать' transport.create', когда я удаляю элемент. –

+0

Я не вижу ничего плохого в вашем коде. Попытайтесь посмотреть этот пост Ответ OnaBai объясняет требование Id в вашей модели, которое, кажется, вы не определили: http://stackoverflow.com/questions/16662223/why-does-the-kendoui-grid-transport-create-event-gets-raised-multiple-times -and – Vojtiik

+0

Вот и все. Спасибо! Добавление id внутри модели - это решение. –

4

если кто-то есть определил id в model, как указано выше, но источник данных, не запускающий transport.destroy еще, ниже конфигурации может быть полезным:

editable: { 
.. 
mode: "inline", //or "popup 
... 
} 
//or 
editable: "inline" //or "popup" 

http://www.telerik.com/forums/transport-destroy-of-grid-editor-is-not-working

+0

Это было для меня также - уничтожить не получится, если editable = false. +1 –

+0

Спасибо Boss .. Watsed 3-4 часовая ошибка этой проблемы .. – Coder

Смежные вопросы