2013-10-04 59 views
8

我想用僅有兩列的表格構建一個非常簡單的Kendo CRUD網格:ID和名稱。我已經使用服務器端分頁和服務器端過濾來配置網格。Kendo Grid不會在創建後使用新創建的ID更新網格

一切似乎都按預期工作,但創建新記錄後,網格顯示新記錄但沒有ID字段。在創建時,請求的ID爲空,但是我在創建後發送id和完整對象的值。在示例網格中,網格用新值更新。我需要更改/添加什麼來確保新創建記錄的ID在Grid中顯示?

以下是JSP:

 <script> 


     $(function() { 
      var dataSource = new kendo.data.DataSource({ 
       transport: { 
        read: { 
         url:"http://localhost:8181/baseweb/countrylist", 
         dataType: "jsonp" 
        }, 
        update: { 
         url: "http://localhost:8181/baseweb/countryupdate", 
         dataType: "jsonp" 
        },  
        destroy: { 
         url: "http://localhost:8181/baseweb/countrydelete", 
         dataType: "jsonp" 
        }, 
        create: { 
         url: "http://localhost:8181/baseweb/countrycreate", 
         dataType: "jsonp" 
        },       
        parameterMap: function(data, operation) { 
         if (operation !== "read" && data.models) { 
          return {grid_options: kendo.stringify(data.models)}; 
         } 
         return {grid_options: kendo.stringify(data)}; 
        }      
       }, 
       serverPaging: true, 
       serverFiltering: true, 
       pageSize: 10, 
       schema: { 
        data: "data",   
        total: "total",      
        model: { 
         id: "id", 
         fields: { 
          id: { editable: false, nullable: true }, 
          name: { validation: { required: true } }         
         } 

        } 
       }     
     }); 

      $("#grid").kendoGrid({ 
       dataSource: dataSource, 
       pageable: true, 
       filterable: true, 
       height: 400, 
       toolbar: ["create"],      
       columns: [ 
          { field: "id", title:"Identification"}, 
          { field: "name", title:"Country Name" }, 
          { command: ["edit", "destroy"], title: "&nbsp;", width: "160px" } 
          ], 
       editable: "popup"   
      }); 
     }); 

    </script> 

參數傳送到服務器上創建: _ 1380846899054個 回調jQuery19108827040256333442_1380846899052 grid_options { 「ID」:空, 「名」: 「測試」}

參數從服務器發送回作爲應答: jQuery19108827040256333442_1380846899052([{ 「ID」: 「4028828f4180d64a014180e3bda20002」, 「名稱」: 「測試」}])

我希望服務器發回的ID應顯示在網格中。我已經搜索了這個論壇,Kendo文檔和谷歌的答案,但我無法找到解決方案。

我錯過了什麼?


更新與解決方案:

Jack's answer提供的線索,以尋找解決方案。我犯了兩個錯誤:

a。 Kendo Grid中的回調似乎期望數據回到「data:」屬性中。我在迴應中沒有將結果集命名爲「data:」。 b。該回調還期望data:屬性中的對象的JSONArray。因爲我只創建一個對象,所以我發送了一個JSONObject。

將包含data:屬性和JSONArray的響應更改爲完美后。 來自客戶端的請求參數如下:

_ 1386350196768 
callback jQuery19101285024500179227_1386350196765 
grid_options {"id":null,"name":"Ghana"} 

修改後的迴應是這樣的:

jQuery19101285024500179227_1386350196765({"data":[{"id":"2c9323ca42c8df630142c944450b0002","name":"Ghana"}]}) 

希望它可以幫助別人,因爲這是不是官方文件中明確記載。

+0

你有沒有想過這個?我遇到同樣的問題,我要返回的ID未在客戶端數據集中設置,因此將其留作「新」項。完成之後的所有操作(創建,更新,刪除)。 – Jack

+1

你的答案幫助我找出解決方案。謝謝。我會發布我自己的答案,以確保它爲其他人正確記錄。 – sohail

回答

3

我有同樣的問題,並認爲我可能已經找到答案。如果在架構中定義了保存結果的對象,則必須在同一對象中返回創建的鏈接的結果。例如:

schema: { 
     data: "data",   
     total: "total", .... 
} 

例如MVC方法:

public JsonResult CreateNewRow(RowModel rowModel) 
{ 
    // rowModel.id will be defaulted to 0 

    // save row to server and get new id back 
    var newId = SaveRowToServer(rowModel); 

    // set new id to model 
    rowModel.id = newId; 

    return Json(new {data= new[] {rowModel}}); 
} 
+3

感謝您的更新。我會嘗試這一點,但我正在認真考慮放棄Kendo以支持其他框架。文檔和示例非常簡單,簡單的事情需要很長時間才能弄清楚。 – sohail

+0

我感覺到你的痛苦 - 他們工作的時候很棒,但如果你有問題...... Google開始你的引擎。 – Jack

+0

我試過但仍然是相同的結果。我將id添加到同一個對象並返回,但id保存後仍未填充。 – sohail

11

有這樣做的一個很好的清潔方法...

如果您的網格中的腳本塊創建:

dataSource: { 
    transport: { 
     read: { 
      url: "..." 
     }, 
     create: { 
      url: "...", 
      type: "POST", 
      complete: function(e) { 
       $("#grid").data("kendoGrid").dataSource.read(); 
     } 
    }, 
}... 

或HTML

@(Html.Kendo().Grid<ViewModel>() 
    .Name("grid") 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .PageSize(10) 
     .Model(model => 
     { 
      model.Id(i => i.Cde); 
      model.Field(i => i.Description).Editable(true); 
     }) 
     .Read(read => read.Action("EditingInline_Read", "UserGroups")) 
     .Update(update => update.Action("EditingInline_Update", "UserGroups")).Read("EditingInline_Read", "UserGroups") 
     .Destroy(delete => delete.Action("EditingInline_Delete", "UserGroups")) 
     .Create(create => create.Action("EditingInline_Create", "UserGroups")).Read("EditingInline_Read", "UserGroups") 
    ) 
    .Columns(columns => 
    { 
     columns.Bound(s => s.Decription); 
     columns.Bound(s => s.enabled); 
     columns.Command(command => { command.Edit(); command.Destroy(); }).Width(200); 
    }) 
    .Pageable() 
    .Sortable() 
    .Selectable(selectable => selectable 
     .Mode(GridSelectionMode.Single)) 
    .ToolBar(toolbar => toolbar.Create())) 

退房的CRUD電話,更具體,更新和創造。

相關問題