这篇文章主要介绍了ASP.Net MVC+Data Table实现分页+排序功能的方法,结合实例形式分析了asp.net基于mvc架构实现的数据查询、排序、分页显示等相关操作技巧,需要的朋友可以参考下

本文实例讲述了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 ;      }    }...

更多相关文章

  1. asp.net core实例教程之项目结构
  2. asp.net core实例教程之异常处理与静态文件教程
  3. 总结.Net MVC实现长轮询实例
  4. asp.net core实例教程之如何设置中间件
  5. 用微信PC端dll库实现截图的实例代码
  6. ASP.NET Core实例详解一
  7. 详解用MicroService4Net 创建一个微服务的实例
  8. asp.net core实例详解三(新建项目)
  9. asp.net core实例详解二(环境设置)

随机推荐

  1. Android热修复三部曲之动态加载补丁.dex
  2. Android textView点击滚动(跑马灯)效果
  3. Android(安卓)仿QQ好友列表功能实现
  4. 基于Android的音乐播放器项目
  5. Animation总结2
  6. android ui imagebutton
  7. 【Android】Android中的数据传递(2)
  8. Android--ExpandbleView源码学习一---Exp
  9. Qt for Android获取手机序列号
  10. Android百度地图SDK:隐藏比例尺,隐藏百度LO