2014-02-06 48 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的了解可能已经过时。 –

相关问题