ASP.NET MVC and jqGrid 学习笔记 4-排序

排序(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--

posted @ 2013-12-19 14:02  ibg  阅读(755)  评论(0编辑  收藏  举报