2014-02-06 51 views
6

我正在使用kendo網格並希望在服務器中執行過濾,排序和分頁。我明白,我要補充的數據源:kendo ui網格過濾器,服務器中的排序和分頁

serverPaging: true, 
serverSorting: true 

但我怎麼告訴網格/數據源哪個URL應該使用的sortig,過濾等 而如果我想執行的sortig自己?我想使用kendo提供的控件,但是要自己去服務器。是否有像「sortTriggered」這樣的事件可以稱爲「prevntDefault」或類似的事情......我不知道。

+0

您正在使用哪種服務器端技術? –

+0

不知道它是否相關,但我們正在使用wcf –

+0

它是相關的。所以現在我發佈了一個沒有樣板JS代碼的簡單配置。 –

回答

3

看看這個例子。它使用Windows Azure的MobileServices javascript api,但向您展示瞭如何自行處理服務器分頁和排序。

http://jsbin.com/efeKiwO/11/edit

在您的數據源的運輸功能,每個方法(讀取,更新,創造,破壞),可以配置爲一個功能(這是讀取功能,它可以處理任何排序和分頁)。

read: function(options) { 
     // Get the table 
     var table = client.getTable("Customer"); 

     // Build base query 
     var query = table.includeTotalCount(); 

     // Add paging 
     if(options.data.skip !== undefined && options.data.take !== undefined) { 
      query = query.skip(options.data.skip).take(options.data.take); 
     } 

     // Add sorting 
     if(typeof options.data.sort !== "undefined" && options.data.sort !== null) { 
      for(var i = 0; i< options.data.sort.length; i++) { 
      if(options.data.sort[i].dir === "desc") { 
       query = query.orderByDescending(options.data.sort[i].field); 
      } 
      else { 
       query = query.orderBy(options.data.sort[i].field); 
       } 
      } 
     } 

     var promise = query.read(); 

     promise.done(function(data) { 
      options.success(data); 
     }); 
     }, 

在這個函數裏面你可以做任何你喜歡的事情。您可以使用$ .getJSON調用或$ .ajax調用,或者其他任何您想要執行的操作,而不是像本示例一樣使用JavaScript庫。該函數的參數對象將包含分頁,排序和篩選所需的所有內容。一旦你有數據,只需調用options.success(dataSet);與你正確的排序/分頁dataSet和你的網格將綁定到它。

+0

這正是我想要做的,但由於某些原因,當我將「serverSorting」添加到數據源時,排序不起作用,並且讀取函數未被調用。 –

+0

如果您在客戶端處理它,則不需要ServerSorting。 –

+0

如果我刪除了「serverSorting」,那麼definitly的讀函數將不會被調用。無論如何,我解決了這個問題。現在正在工作,謝謝。 –

0

Kendo網格只使用一個URL來檢索數據,它將從DataSource對象中獲取。

網格每次需要數據時都會被網格調用,排序和分頁參數將被添加到基於網格上下文的服務器的每個請求中。

然後,服務器將收到一個標準的Web請求,其中包含所有需要構建自己請求的參數。然後你將不得不作爲響應正確格式化(例如:JSONP OData)。

+0

所以我不能有我想要的任何網址?如果我有一個特殊的網址,我不能使用它? –

+0

你的意思是說你有不同的URL基於你想要的排序/頁面? –

+0

不同的網址,不同的參數... –

3

你的配置幾乎在那裏,

缺少的是連接到MVC的祕訣。

讓我們假設你的數據源配置是這樣的:

var myDataSource = new kendo.data.DataSource({ 
    transport: { 
     read: { 
      url: 'Users/Read', 
      type: 'POST' 
     } 
    }, 
    serverSorting: true, 
    serverFiltering: true, 
    serverPaging: true 
} 

在您的服務器側UsersController.cs(例如),你必須接受[DataSourceRequest]

public DataSourceResult Read([DataSourceRequest] DataSourceRequest request) 
{ 
    // Here you might actually get the items from your cache or database. 
    var List<User> myList = new List<User>();   

    // Here is when the kendo magic happens. 
    return myList.ToDataSourceResult(request); 
} 

爲什麼[DataSourceRequest ]很重要?

因爲它包含分頁,排序,過濾網格要求服務器的參數。所以如果你想自己做算法,你必須檢查請求並處理這些參數。只記得返回一個DataSourceResult對象實例。

如果你的對象存在於緩存中,並且你的字段不需要過濾,分組,排序等特殊處理,那麼就使用kendo C#擴展ToDataSourceResult。它將處理您的項目並使用動態LINQ語句應用篩選,排序和分頁配置。

+0

假設實體框架或從服務器端的其他IQueryable結果,將如何.ToDataSourceResult工作...從我的理解,它會做內存中的分頁/排序等,而不是讓sql server做繁重的工作... –

+0

那麼,這是更多的是要問劍道傢伙的問題。我檢查了一下他們的C#代碼,並且他們使用LINQ來完成所有需要的轉換,所以它實際上取決於備份IEnumerable的內容。所以數據庫可能會在最後完成所有的重要工作。在將它傳遞給kendo之前,請不要將您的查詢實現到內存中的對象中。免責聲明:雖然我們沒有購買使用最新kendo版本的許可證,但我們不再依賴該框架,所以我對服務器端kendo的瞭解可能已經過時。 –

相關問題