当前位置: 首页 > news >正文

ASP.Net MVC + Data Table 实现分页+排序



实现思路:
使用datatable内置的分页,排序
使用attribute+反射来控制需要排序和显示的字段以及顺序
分离排序和显示逻辑
若要添加搜索逻辑只需要传递搜索的字段到后端即可(js初始化时把"searching": false拿掉)。




View :


@using BCMS.BusinessLogic
@using BCMS.BusinessLogic.Models
@model List<BusCaptainObj>


<table id="tblData" class="table table-striped">
    <thead>
        <tr class="data-list">
            <th style="width:10%;">@Html.DisplayNameFor(model => model.First().PersNo)</th>
            <th style="width:30%;">@Html.DisplayNameFor(model => model.First().Personnel_Name)</th>
            <th style="width:20%;">@Html.DisplayNameFor(model => model.First().Position)</th>
            <th style="width:20%;">@Html.DisplayNameFor(model => model.First().Interchange)</th>
            <th style="width:20%;">Action</th>
        </tr>
    </thead>
</table>


@section scripts {
    <script type="text/javascript">
         @{
             var columns = DataTableHelper.DisplayColumns<BusCaptainObj>();
         }


        $(document).ready(function () {
            $('#tblData').dataTable({
                "processing": true,
                "serverSide": true,
                "searching": false,
                "stateSave": true,
                "oLanguage": { "sInfoFiltered": "" },
                "ajax": {
                    "url": @Url.Action("GetJsonData"),
                    "type": "GET"
                },
                "columns": [
                    { "data": "@columns[0]" },
                    { "data": "@columns[1]" },
                    { "data": "@columns[2]" },
                    { "data": "@columns[3]" },
                    {
                        "data": "@columns[0]",
                        "orderable": false,
                        "searchable": false,
                        "render": function (data, type, full, meta) {
                            if (type === 'display') {
                                return GetDetailButton("/BusCaptain/Detail?bcId=", data) + GetInfoButton("/Telematics?bcId=", data, "Performance");
                            } else { return data; }
                        }
                    }
                ],
                "order": [[0, "asc"]]
            });
        });
    </script>
}







Controller :


 
 public ActionResult GetJsonData(int draw, int start, int length)
        {
            
            string search = Request.QueryString[DataTableQueryString.Searching];
            string sortColumn = "";
            string sortDirection = "asc";


            if (Request.QueryString[DataTableQueryString.OrderingColumn] != null)
            {
                sortColumn = GetSortColumn(Request.QueryString[DataTableQueryString.OrderingColumn]);
            }
            if (Request.QueryString[DataTableQueryString.OrderingDir] != null)
            {
                sortDirection = Request.QueryString[DataTableQueryString.OrderingDir];
            }


            DataTableData dataTableData = new DataTableData();
            dataTableData.draw = draw;
            int recordsFiltered = 0;
            dataTableData.data = BusCaptainService.Instance.SearchMyBuscaptains(User.Identity.Name, out recordsFiltered, start, length, sortColumn, sortDirection, search).Data;


            dataTableData.recordsFiltered = recordsFiltered;


            return Json(dataTableData, JsonRequestBehavior.AllowGet);
        }


        public string GetSortColumn(string sortColumnNo)
        {
            var name = DataTableHelper.SoringColumnName<BusCaptainObj>(sortColumnNo);
            return name;
        }


        public class DataTableData
        {
            public int draw { get; set; }
            public int recordsFiltered { get; set; }
            public List<BusCaptainObj> data { get; set; }
        }





Model :
 class XXX{
	...
 	[DisplayColumn(0)]
        [SortingColumn(0)]
        public int? A { get; set; }
	
        [DisplayColumn(1)]
        [SortingColumn(1)]
        public string B { get; set; }
	...
	}



Helper class :


public class SortingColumnAttribute : Attribute
    {
        public int Index { get; }


        public SortingColumnAttribute(int index)
        {
            Index = index;
        }
    }


    public class DisplayColumnAttribute : Attribute
    {
        public int Index { get; }


        public DisplayColumnAttribute(int index)
        {
            Index = index;
        }
    }




public static class DataTableQueryString
    {
        public static string OrderingColumn = "order[0][column]";
        public static string OrderingDir = "order[0][dir]";
        public static string Searching = "search[value]";
    }


    public static class DataTableHelper
    {
        public static IList<string> DisplayColumns<T>()
        {
            var result = new Dictionary<int, string>();


            var props = typeof(T).GetProperties();
            foreach (var propertyInfo in props)
            {
                var propAttr =
                    propertyInfo
                        .GetCustomAttributes(false)
                        .OfType<DisplayColumnAttribute>()
                        .FirstOrDefault();
                if (propAttr != null)
                {
                    result.Add(propAttr.Index,propertyInfo.Name);
                }
            }


            return result.OrderBy(x => x.Key).Select(x => x.Value).ToList();
        }
        public static string SoringColumnName<T>(string columnIndex)
        {
            int index;
            if (!int.TryParse(columnIndex, out index))
            {
                throw new ArgumentOutOfRangeException();
            }


            return SoringColumnName<T>(index);
        }


        public static string SoringColumnName<T>(int index)
        {
            var props = typeof(T).GetProperties();
            foreach (var propertyInfo in props)
            {
                var propAttr =
                    propertyInfo
                        .GetCustomAttributes(false)
                        .OfType<SortingColumnAttribute>()
                        .FirstOrDefault();
                if (propAttr != null && propAttr.Index == index)
                {
                    return propertyInfo.Name;
                }
            }


            return "";
        }
    }



Query:


...
var query = context.BusCaptains
                        .Where(x => ...)
                        .OrderByEx(sortDirection, sortField)
                        .Skip(start)
                        .Take(pageSize);






...



LINQ Helper :


...
public static IQueryable<T> OrderByEx<T>(this IQueryable<T> q, string direction, string fieldName)
        {
            try
            {
                var customProperty = typeof(T).GetCustomAttributes(false).OfType<ColumnAttribute>().FirstOrDefault();
                if (customProperty != null)
                {
                    fieldName = customProperty.Name;
                }


                var param = Expression.Parameter(typeof(T), "p");
                var prop = Expression.Property(param, fieldName);
                var exp = Expression.Lambda(prop, param);
                string method = direction.ToLower() == "asc" ? "OrderBy" : "OrderByDescending";
                Type[] types = new Type[] {q.ElementType, exp.Body.Type};
                var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
                return q.Provider.CreateQuery<T>(mce);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("error form OrderByEx.");
                _log.Error(ex);
                throw ;
            }
        }
...


相关文章:

  • SSL 链接安全协议的enum
  • C# https客户端获取证书的工具方法
  • [重构心得] 接一个烂Project怎么办
  • CentOS 5.1 做NAT代理,实现封迅雷,BT,pplive.
  • C# 中的Retry 模型
  • Apple应用消息通知 swift前端c#后端
  • MySQL数据库灾难恢复
  • 使用C# Diagnostics.DebuggerDisplay属性提高调试信息可读性
  • PDI简单介绍之ETL工具-----spoon
  • python flask web环境配置步骤
  • python flask SQLAlchemy 的用法
  • Blog须知
  • Azure VM Scalable Sets -- 适用IAAS架构
  • 数据库设计技巧14则
  • 一张图说明HTTPS 握手过程
  • 「译」Node.js Streams 基础
  • Angular Elements 及其运作原理
  • Go 语言编译器的 //go: 详解
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • isset在php5.6-和php7.0+的一些差异
  • linux安装openssl、swoole等扩展的具体步骤
  • Markdown 语法简单说明
  • mongo索引构建
  • React的组件模式
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SQLServer插入数据
  • vue学习系列(二)vue-cli
  • webpack4 一点通
  • 对JS继承的一点思考
  • 工程优化暨babel升级小记
  • 关于extract.autodesk.io的一些说明
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (1)(1.13) SiK无线电高级配置(六)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (编译到47%失败)to be deleted
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (分布式缓存)Redis哨兵
  • (附源码)ssm高校实验室 毕业设计 800008
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十)c52学习之旅-定时器实验
  • (十)T检验-第一部分
  • ***原理与防范
  • .net 中viewstate的原理和使用
  • .NET/C# 获取一个正在运行的进程的命令行参数