Wijmo 更优美的jQuery UI部件集:服务器端Grid魔法

在之前的一篇文章中,我们讨论了如何添加一大堆的超赞的功能到一个标准的HTML表,并把它转换成一个“grid”表格。今天我想要做的事情是向你展示如何将这些功能转到服务器。

通过使用服务器做大量的“苦力活儿”,我们可以向我们的最终用户提供更加平顺的用户体验。什么苦力活要交给服务器呢?假设你有一百万行的数据集,这些数据要是发送到客户端,然后再进行排序/分页/过滤,那会是相当可观的一堆流量。但是如果我们要求服务器在发送数据到客户端之前执行排序/分页/过滤,我们可以迅速的减少客户端的开销。

 

服务器

关于数据,我使用Chinook数据库。它速度快,容易设置,同时可以给我的例子提供很好的数据。我在例子中使用到了ASP.NET MVC3,并且我们只实现排序和过滤。

public JsonResult GetAlbumList()

{

int pageSize = Request.Params["paging[pageSize]"] != null ? Convert.ToInt32(Request.Params["paging[pageSize]"]) : 0;

int pageIndex = Request.Params["paging[pageIndex]"] != null ? Convert.ToInt32(Request.Params["paging[pageIndex]"]) : 0;

string sortColumn = Request.Params["sorting[0][dataKey]"];

string sortDirection = Request.Params["sorting[0][sortDirection]"];

if (string.IsNullOrEmpty(sortColumn)) sortColumn = String.Empty;

if (string.IsNullOrEmpty(sortDirection)) sortDirection = String.Empty;

using (var entity = new ChinookEntities())

{

var allAlbums = from al in entity.Albums

join ar in entity.Artists on al.ArtistId equals ar.ArtistId

select new AlbumResult()

{

AlbumName = al.Title,

ArtistName = ar.Name

};

var totalRowCount = allAlbums.Count();

if (pageSize == 0)

pageSize = totalRowCount;

if (sortColumn.ToLower() != "album")

allAlbums = sortDirection.ToLower() == "descending"

? allAlbums.OrderByDescending(p => p.ArtistName).Skip(pageSize*pageIndex).Take(pageSize)

: allAlbums.OrderBy(p => p.ArtistName).Skip(pageSize*pageIndex).Take(pageSize);

else

allAlbums = sortDirection.ToLower() == "descending"

? allAlbums.OrderByDescending(p => p.AlbumName).Skip(pageSize*pageIndex).Take(pageSize)

: allAlbums.OrderBy(p => p.AlbumName).Skip(pageSize*pageIndex).Take(pageSize);

var result = new WijmoGridResult { Items = allAlbums.ToList(), TotalRowCount = totalRowCount };

return Json(result, JsonRequestBehavior.AllowGet);

}

}

 

 

让我们一行一行的看一看这些代码都作了些什么,因为他确实做了很多事情!最初的六行抽取了Wijmo需要发送的Request参数。因为很有可能这些值为空,一点点的参数检查逻辑是必须的。

从using表达式开始,我们使用Entity Framework打开一个到我们数据库的链接。我们使用延迟加载的想法对创建结构化查询,因此和SQL服务器的交互只有一次。第一次查询创建对数据库中所有相册的查询。获取所有行的个数是必须的。Wijmo会使用这个结果判断分页需求。

关于排序,你也许已经被巨复杂的IF..ELSE表达式折磨得疲惫不堪。所有这些逻辑仅仅是为了判断我们要基于哪一列进行排序以及按照何种方式(升序或者降序)进行排列,同时应用LINQ过滤。这些调用同时也使用了Skip()以及Take()技术进行分页。

最后,你可能注意到了我还没有给出AlbumReult以及WijmoGridResult的定义。以下是这些类的代码:

public class AlbumResult

{

public string AlbumName { get; set; }

public string ArtistName { get; set; }

}

public class WijmoGridResult

{

public List Items { get; set; }

public int TotalRowCount { get; set; }

}

 

 

客户端

现在服务器端已经配置好了,我们需要改变一点Wijmo的配置以以便使用这些新设置。

$(document).ready(function () {

var dataReader = new wijarrayreader([

{ name: "Artist", mapping: "ArtistName" },

{ name: "Album", mapping: "AlbumName" }

]);

var dataSource = new wijdatasource({

proxy: new wijhttpproxy({

url: "@Url.Action("GetAlbumList")",

dataType: "json"

}),

dynamic: true,

reader: {

read: function (datasource) {

var count = datasource.data.TotalRowCount;

datasource.data = datasource.data.Items;

datasource.data.totalRows = count;

dataReader.read(datasource);

}

}

});

$("#remoteTable").wijgrid({

pageSize: 15,

data: dataSource,

allowPaging: true,

allowSorting: true

});

});

 

 

在最开始,我们打算声明一个新的datareader,用来读取来自服务器的JSON数据。它将告诉Wijmo如何将JSON属性映射到表格的列。

接下来是数据源。这是一个URL的代理。Wijmo会在这个URL上做一个GET操作以获取信息。这里dynamic关键字告诉Wijmo,服务器会接受排序,过滤以及分页请求。如果它被设置为false或者从来都没有设置过,Wijmo不会发送我们之前提到的请求参数。Reader告诉Wijmo如何解释数据,并且获取行数,之后是应用darareader。

 

最后一个调用是真正的创建WijGrid。这和你之前曾经看过的没有什么不同。唯一使得服务器收集数据的设置就是datasource。

时间: 2024-10-25 18:11:34

Wijmo 更优美的jQuery UI部件集:服务器端Grid魔法的相关文章

Wijmo 更优美的jQuery UI部件集:通过jsFiddle测试Wijmo Gauges

Wijmo 的巨大优势之一就是,它们是非常流行的jQuery UI部件.这将意味着它们的基础类库具有很多支持者.具有众多的支持者同时也意味着更多好用的工具.这些好用的工具之一就是很酷的jsFiddle,这是一个实时的HTML/CSS/JavaScript snippet编辑器.用它来以一种迅速的无开销的方式测试一些小东西是相当棒的.事实上,我们可以用它来实时的测试一些wijmo部件,这里我们会看到如何做到这一点.因为Wijmo gauges使用到了基于浏览器能力的SVG或者VML,这些是"无插件

Wijmo 更优美的jQuery UI部件集:发现 Wijmo

内容  1 什么是Wijmo?  2 jQuery 语法  3 jQuery 选择器      3.1 jQuery 元素选择器      3.2 jQuery 属性选择器      3.3 jQuery CSS 选择器  4 文件准备功能  5 jQuery 选项  6 如何引用Wijmo  7 创建你的第一个jQuery 工程   什么是 Wijmo? Wijmo 是一个基于jQuery UI的UI部件的套件.Wijmo 部件对客户端Web开发进行了优化,并且充分利用了jQuery的强大能力

Wijmo 更优美的jQuery UI部件集:爱上 ThemeRoller

Wijmo 是一个基于jQuery UI的UI部件的套件.Wijmo最方便使用的特点之一就是兼容ThemeRoller.ThemeRoller 是一个创建独特的jQuery UI web 部件主题皮肤的web应用程序.凭借其简单的界面和所见即所得的预览功能,你可以用比使用图形编辑器更短的时间为你的Wijmo部件以及其他兼容ThemeRoller的部件创建皮肤.   拉开帷幕:ThemeRoller 基础 我们可以在这里找到ThemeRoller Web 应用程序 jqueryui.com/the

Wijmo 更优美的jQuery UI部件集:活动日历控件(Event Calendar)

Wijmo Event Calendar活动日历控件,是一个功能齐全的活动日历控件,允许用户添加,编辑和管理他们的日程.默认情况下,控件将使用Html5的Local Storage特性,进行离线数据存储,用户可以在不连接网路的情况下,使用网页来管理自己的日程,无需额外的配置. Wijmo Event Calendar支持用户自定义数据存储方式.Wijmo Event Calendar 控件在设计之初就将数据展现和数据存储进行分离,您可以使用amplify.store库,实现本地数据存储.然后设置

Wijmo 更优美的jQuery UI部件集:复合图表(CompositeChart)

Wijmo的CompositeChart控件允许您使用一个Chart来分析和展现复杂的数据.相同的数据可以使用不同的可视化效果,不同的图表类型展现在一个图表内,使得用户可以从不同的角度,了解分析这组数据所表达的内容 . 本文将介绍如何使用Wijmo的CompositeChart控件,制作一个复合图表.CompositeChart 的API:http://wijmo.com/wiki/index.php/Compositechart,Wijmo 的CompositeChart 化繁为简,将传统 E

Wijmo 更优美的jQuery UI部件集:在安全站点使用Wijmo控件

通常我们总会遇到这样的问题,在安全站点(HTTPS)中使用C1Wijmo控件时,用户可能会收到脚本错误. 发生这种状况的是由于我们的CDN链接不是https链接.   解决HTTPS 的错误 为了解决上述脚本问题,你需要使用本地的脚本文件,而不是使用网上CDN的链接.你可以使用以下解决方案之一: 解决方案1. 在设计视图下,取消选中C1Wijmo控件的SmartTag上的 "UseCDN"选项. 解决方案2. 你可以在网站配置文件中,明确地将该选项设置为false: <appSe

Wijmo 更优美的jQuery UI部件集:导出Wijmo的GridView到Excel

Wijmo GridView 控件不提供导出Excel文件的方法.本篇博客介绍一种将Wijmo的GridView控件保存到Excel的简单方法.你可以使用同样的方法在C1 WebUI GridView上.   步骤1 : 将C1GridView绑定至数据源 第一步是将C1GridView绑定到数据源.为了简单起见,我们将其绑定到C1Nwind.mdb的Customers表.   步骤2 : 导出C1GridView 至Excel 导出到Excel需要分成两步.第一步是将GridView保存至一个

Wijmo 更优美的jQuery UI部件集:C1 Wijmo Grids 更多惊喜

本文中,我将给大家介绍一系列非常棒的 Wijmo Grids功能.我们先以一个新的Wijmo Grids 来开始我们这次的 Wijmo Grids 之旅吧.     <BR> <table id="tableDepartmentInformation"><BR> <thead><BR> <tr><BR> <th>First Name<BR> </th><BR&g

Wijmo 更优美的jQuery UI部件集:自定义 C1WijMenu

C1Wijmo 全部的控件是完全可定制的,并且可以根据你自己的需求定制他们的界面外观. 我准备使用C1Menu演示这一点. 让我们从向控件应用自定义主题开始.   改变主题 1) 创建一个网站,然后拖放一个C1Menu到web页面上. 2) 单击智能标记,并打开任务菜单. 3) 在主题属性中输入CDN的URL以指定主题. 例如,在我们的这个例子中,我们应用ui-darkness 主题 http://jquery-ui.googlecode.com/svn/tags/1.8.14/themes/u