2013-06-25 99 views
1

我希望能夠使用ajax調用的結果來決定哪個Kendo網格將填充。如果我只接收一個數組中的項目,我想填充一個網格,否則我有多個項目的另一個網格。使用Ajax結果填充Kendo網格

我的jQuery

$.ajax({ 
     type: "POST", 
     dataType: "json", 
     url: 'Item/GetItems/', 
     data: { number: number }, 
     success: function (data) { 

      if (data.length == 1) { 
       var sGrid = $("#SingleGrid").data("kendoGrid").dataSource.data(data); 

       //I´ve also tried this 
       //sGrid.refresh(); 
      } 
      else { 
       var mGrid = $("#MultipleGrid").data("kendoGrid").dataSource.data(data); 

       //I´ve also tried this 
       //mGrid .refresh(); 
      } 
     }, 
     error: function() { 
     } 
    }); 

我的控制器動作

public ActionResult GetItems([DataSourceRequest] DataSourceRequest request, string number) 
    { 
     var items = _idg.GetItems(number); 
     return Json(items.ToDataSourceResult(request, ModelState)); 
    } 

從來就一直在監測螢火蟲,它顯示沒有錯誤。我試圖通過決定填充其中一個網格來阻止對服務器的第二次調用。有沒有像這個客戶端的方式強制dataSource刷新? (不調用DataSource的讀取功能,將調用第二次服務器)編輯後的########

function TestGrid() { 
    var dataSource = new kendo.data.DataSource({ 
     transport: { 
      read: { 
       type: "POST", 
       dataType: "json", 
       url: 'Item/GetItems/' 
      } 
     }, 
     schema: { 
      data: function (response) { 
       // Here the Total is always correct 
       return response.Total; 
      } 
     } 
    }); 

    dataSource.fetch(function() { 
     var kendoGrid; 
     var data = this.data(); 
     //Here the data does not include my Total 
     alert(data); 
     if (data.length == 1) { 
      kendoGrid = $("#SingleGrid").data("kendoGrid"); 
     } else { 
      kendoGrid = $("#MultipleGrid").data("kendoGrid"); 
     } 
     kendoGrid.setDataSource(dataSource); 
     kendoGrid.refresh(); 
    }); 
} 

從我上面的例子

######我似乎無法達到this.data()的總數。當我用Firebug進行調試時,我可以看到總數總是正確的。有任何想法嗎?

回答

5

您可以填充kendo數據源的新實例,加載數據,然後對結果進行操作,設置網格的數據源。也許是這樣的:

var dataSource = new kendo.data.DataSource({ 
    transport: { 
    read: { 
     type: "POST", 
     dataType: "json", 
     url: 'Item/GetItems/', 
     data: { number: number }, 
    } 
    } 
}); 

然後取該結果從服務器和行爲的數據:

dataSource.fetch(function() { 
    var data = this.data(); 
    var kendoGrid; 
    if (data.length == 1) { 
    kendoGrid = $("#SingleGrid").data("kendoGrid"); 
    } else { 
    kendoGrid = $("#MultipleGrid").data("kendoGrid"); 
    } 
    // Replace the grids data source with our new populated data source 
    kendoGrid.setDataSource(dataSource); 
    kendoGrid.refresh(); 
}); 
+0

感謝您的回答@boniestlawyer,我按照您的建議實施,但我的網格仍未顯示數據。我可以在Firebug中看到數據正在從控制器傳遞,但沒有出現。當我計算新數據源中的元素(使用total()函數)時,我總是收不到數據源,就好像數據源是空的。也許我正在使用錯誤的函數來計算dataSource,或者我可能沒有以正確的方式填充dataSource。有任何想法嗎? :) – gardarvalur

+0

我懷疑這將與數據傳遞到瀏覽器有關。嘗試像下面這樣將模式 - >數據函數添加到您的kendo數據源中:http://docs.kendoui.c​​om/api/framework/datasource#configuration-schema,並調試該函數以檢查您獲得的響應。 – boniestlawyer

+0

這可能就像你在暗示的那樣,來自服務器的數據在某種程度上不能正確地通過,或者至少沒有正確的數據綁定。我是否正確地假設dataSource始終以DataSourceResult的形式從控制器讀取數據? (就像我的例子所示) – gardarvalur

0

你也可以做這樣的事情。

$("#grid").kendoGrid({ 
      dataSource: { 
       transport: { 
        read: { 
         url: "http://localhost:13073/home/KendoGriddata", 
         dataType: "json", 
         type: "Post", 
         data: function() { 
          var dt = { MultipleSearchText: 'rikin' }; 
          return dt; 
         } 
        } 
       }, 
       pageSize: 5  
      });