2016-11-14 151 views
0

我有一個網絡與Web Api服務器端排序,它的工作原理。我有一個要求添加過濾。當網格的數據源將過濾參數發送到Web Api控制器時,Filter對象始終爲「空」,而非空。這裏是我的設置Kendo網格服務器端MVC過濾

電網數據源:

var myTeamGridDataSource = new kendo.data.DataSource({ 
    serverPaging: true, 
    serverSorting: true, 
    serverFiltering: true, 
    schema: { 
     data: "data", 
     total: "count" 
    }, 
    pageSize: 10, 
    transport: { 
     read: { 
      url: baseMyTeamUrl, // web api 
      dataType: "json", 
      type: "POST",    
     } 
    },  
    sort: { 
     field: "Name", 
     dir: "asc" 
    } 
}); 

行動:

public HttpResponseMessage KendoGridMyTeam(GridInputModel inputModel) 
{ 
    ... 
} 

GridInputModel.cs

public class GridInputModel 
{ 
    public int Page { get; set; } 
    public int PageSize { get; set; } 
    public int Skip { get; set; } 
    public int Take { get; set; } 
    public List<GridInputSortModel> Sort { get; set; } 
    public List<GridInputFilterModel> Filter { get; set; } 
} 

GridInputFilterModel.cs

public class GridInputFilterModel 
{ 
    public GridInputFilterModel() 
    { 
     filters = new List<GridInputFilterModel>(); 
    } 
    public string field { get; set; } 
    public string Operator { get; set; } 
    public object value { get; set; } 
    public string logic { get; set; } 
    public List<GridInputFilterModel> filters { get; set; } 

} 

請求主體

take=10&skip=0&page=1&pageSize=10&sort[0][field]=Name&sort[0][dir]=asc 
&filter[filters][0][field]=Name 
&filter[filters][0][operator]=eq 
&filter[filters][0][value]=cling 
&filter[logic]=and 

的GridInputModel「GridInputModel inputModel」被實例化,以及排序的對象是預設的和功能的工作就好了。但是,設置在客戶端併發送到服務器的過濾器是空的。經過一番搜索之後,我無法找到服務器端網格過濾的現代示例。您可能會建議我使用Kendo.Mvc庫:

[DataSourceRequest] DataSourceRequest request 

這也會在請求中創建一個Filter對象,但過濾器也是空的。有什麼建議麼?我會猶豫使用的一個選擇是使用parameterMap並將查詢過濾器發送到查詢字符串中。如果我必須,很好,但有人必須有這個工作。

回答

1

發生了什麼事情是您的應用程序服務器端並未正確反序列化篩選器對象。如果您將該參數設置爲對象並查看發送的實際JSON,則可以查看它。你的過濾器將出現在字符串中。使用參數映射並在發送過濾器數組之前對其進行格式化,您可能會重載使用kendo的DataSourceClass。我有同樣的問題,必須創建我自己的類,並在發送前格式化過濾器。混淆過濾器的問題是過濾器數組中的操作員屬性。

1

在JavaScript試試這個:

var grid = $("#YourGridId").data("kendoGrid"); 
var $filter = new Array(); 
$filter.push({ field: "Name", operator: "eq", value: "cling" }); 
grid.dataSource.filter($filter); 

,並在您的控制器方法,你需要這樣的簽名:

public ActionResult ReadData([DataSourceRequest]DataSourceRequest request){ 
    ... 
} 
0

我使用MVC代替的WebAPI,但我得到的同樣的症狀一個空過濾器傳遞給我的控制器方法。我也在創建我自己的模型的兔子洞中處理髮送給我的控制器方法的請求參數,試圖解析Kendo的過濾器結構等等。我終於通過在Falafel的博客上遵循this example來工作。具體而言,您需要將下面列出的更改添加到您的代碼中。最後,下面顯示的技術可以很容易地爲Kendo的DataSource實現服務器處理(一旦你知道所有需要的部分來使其工作)。

網格數據源:您必須匹配從服務器返回的所有(區分大小寫)字段。我遺漏了錯誤,並停止工作。您可能需要更改類型才能使用WebApi。

type: "aspnetmvc-ajax", 
schema: { 
    data: "Data", 
    total: "Total", 
    errors: "Errors", 
    model: { 
     id: "YourKeyFieldName" 
    } 
}, 

操作:是的,您需要使用Kendo的DataSourceRequest對象及其屬性。

using Kendo.MVC.UI; 
using Kendo.MVC.Extensions; 
[HttpPost] 
public ActionResult KendoGridMyTeam([DataSourceRequest] DataSourceRequest request) 
{ 
    ... 
    return Json(yourDataVariable.ToDataSource(request)); 
} 
相關問題