排序(Sorting)分为两种:客户端排序和服务端排序
客户端排序的意思是把数据从数据库里一次性全部提取出来,然后在客户端进行排序,以后每次点击标题进行排序时,就不会给服务端传递请求了。这个“一次性”就是:
loadonce: true
是的没错!在jqgird里加入这句就是客户端排序了,因为jqgrid看到loadonce:true的时候,就会自动把datatype改成local:
datatype: "local"
虽然你设置的是json。
还要注意的是,要在jqgrid里加入sortorder,sortname参数。
加这2个参数的原因是因为我们要用到ViewModel。
为什么要用ViewModel?
因为每次jqgrid向服务端的请求都是那几个参数,每个action里都写那些参数(sidx、sord、page、rows、_search)的话就重复了,Don’t repeat yourself !
从ViewModel开始
一、ViewModel
在解决方案资源管理器里新建一个文件夹ViewModel
添加一个JqGridViewModel.cs类文件,里面的属性就是jqgrid的参数,名称大小写要保持一致。
namespace HelloJqGrid.ViewModel { public class JqGridViewModel { public string sidx { get; set; } public string sord { get; set; } public int page { get; set; } public int rows { get; set; } public bool _search { get; set; } } }
二、View
@{ ViewBag.Title = "ShowSorting"; } <h2>ShowSorting</h2> <script type="text/javascript"> $(function () { jQuery("#grid").jqGrid({ url: "/Home/GetSortingData", datatype: "json", mtype:"get", colModel: [ {label:'Number', name: 'No', index: 'No', width: 60, sorttype: "int" }, {label:'Name', name: 'Name', index: 'Name', width: 90 }, {label:'Email', name: 'Email', index: 'Email', width: 100,sortable:false}, {label:'Created On', name: 'CreatedOn', index: 'CreatedOn', width: 100 } ], caption: "jqGrid data", loadonce: true, //客户端排序:把服务端的数据都加载到页面。datatype会自动设置为local,所有的操作都在客户端完成。 //loadonce: false, //服务端排序:排序翻页等操作在服务端完成 rowNum: 100, //大于等于总记录数 rowList:[5,10,20], //设置分页下拉列表 pager: "pager", viewrecords: true, width: 500, height: "auto", jsonReader: { repeatitems: false }, sortorder:"asc",sortname:"No" }); }); </script> <table id="grid"></table> <div id="pager"></div>
三、Controller
服务端的排序需要用到Dynamic Linq,这个可以通过NuGet获得:
然后引入命名空间:
客户端排序和服务端排序的action都是一样的:
//排序 public ActionResult ShowSorting() { return View(); } public ActionResult GetSortingData(JqGridViewModel grid) { MyContext db = new MyContext(); var query = db.Members.AsQueryable(); int pageNum =grid.page; //当前显示哪一页 int pageSize =grid.rows; //每一页显示多少条记录 int totalRecords =query.Count();//总记录数 int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);//总页数 //排序-若出现:No property or field 'asc' exists in type 'Member' //解决办法:检查jqgrid里设置sortorder和sortname参数没有。 query = query.OrderBy(grid.sidx + " " + grid.sord); var jsonData = new { total = totalPages, page = pageNum, records = totalRecords, rows = query.Skip((pageNum - 1) * pageSize).Take(pageSize)//分页 }; return Json(jsonData, JsonRequestBehavior.AllowGet); }
看一下ViewModel传来的参数:
这样用服务端排序时,点击jqgrid的标题,就可以给服务端传递参数了。
--End--