如何使用 Datatables.AspNet.Mvc5 进行服务器端排序

Posted

技术标签:

【中文标题】如何使用 Datatables.AspNet.Mvc5 进行服务器端排序【英文标题】:How to do server-side sorting with Datatables.AspNet.Mvc5 【发布时间】:2017-06-17 11:52:26 【问题描述】:

我正在尝试使用带有实体框架的 ASP.NET MVC 对 jQuery DataTables 进行服务器端处理。我遇到了Datatables.AspNet Nuget 包,但我不清楚如何在单击表头时使用它对列进行动态排序。

在example on Datatables.AspNet GitHub 中,有这样的:

public ActionResult PageData(IDataTablesRequest request)

    var data = Models.SampleEntity.GetSampleData(); 
    var filteredData = data.Where(_item => _item.Name.Contains(request.Search.Value));

    // Paging filtered data.
    var dataPage = filteredData.Skip(request.Start).Take(request.Length);

    var response = DataTablesResponse.Create(request, data.Count(), filteredData.Count(), dataPage);

    return new DataTablesJsonResult(response, JsonRequestBehavior.AllowGet);

但我不确定如何根据 IDataTablesRequest 对象的内容进行动态排序,如下所示:

public interface IDataTablesRequest

    int Draw  get; 
    int Start  get;         
    int Length  get; 
    ISearch Search  get; 
    IEnumerable<IColumn> Columns  get; 
    IDictionary<string, object> AdditionalParameters  get; 


public interface ISort

    int Order  get; 
    SortDirection Direction  get; 


public enum SortDirection

    Ascending = 0,
    Descending = 1

【问题讨论】:

看看这里:codeproject.com/Articles/1118363/… @EhsanSajjad,谢谢,但看起来您的代码是基于旧版本的 Datatables.AspNet 包。 GetSortedColumns 方法似乎不存在了。 实际上,我刚刚意识到我使用的是不同的 Nuget 包。你的引用 datatables.mvc5 而我正在使用 datatables.aspnet.mvc5 这似乎是两个不相关的项目,这将解释“缺失”方法。但我仍然明白这个想法。将仔细查看您的代码,看看我是否可以应用它。 【参考方案1】:

看看这个答案:https://github.com/ALMMa/datatables.aspnet/issues/26

供参考:

public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, IEnumerable<DataTables.AspNet.Core.IColumn> sortModels)
        
            var expression = source.Expression;
            int count = 0;
            foreach (var item in sortModels)
            
                var parameter = Expression.Parameter(typeof(T), "x");
                var selector = Expression.PropertyOrField(parameter, item.Field);
                var method = item.Sort.Direction == DataTables.AspNet.Core.SortDirection.Descending ?
                    (count == 0 ? "OrderByDescending" : "ThenByDescending") :
                    (count == 0 ? "OrderBy" : "ThenBy");
                expression = Expression.Call(typeof(Queryable), method,
                    new Type[]  source.ElementType, selector.Type ,
                    expression, Expression.Quote(Expression.Lambda(selector, parameter)));
                count++;
            
            return count > 0 ? source.Provider.CreateQuery<T>(expression) : source;
        

因此您可以执行以下操作:

var orderColums = request.Columns.Where(x => x.Sort != null);
 var dataPage = data.OrderBy(orderColums).Skip(request.Start).Take(request.Length);

【讨论】:

【参考方案2】:

我知道这是迟到的答案,但对于任何有兴趣的人来说......在 Asp .NET Core 上使用 Datatable

这里 YOURMODEL: 应该是同一类型

public IEnumerable<YOURMODEL> SortDataByColumn(IEnumerable<YOURMODEL> data, IDataTablesRequest request)

     var sortColumn = request.Columns.FirstOrDefault(s => s.Sort != null);

     if(sortColumn == null) return data;

     if (sortColumn.Sort.Direction == SortDirection.Descending)
     
        return data.OrderByDescending(c => c.GetType().GetProperty(sortColumn.Field).GetValue(c));
     

    return data.OrderBy(c => c.GetType().GetProperty(sortColumn.Field).GetValue(c));

仅供参考..这假定对单个列进行排序.....

【讨论】:

【参考方案3】:

// c#

公共类 JQueryDataTableParamModel 公共 Int32 开始 获取;放;

    public Int32 length  get; set; 

    public JQueryDataTableOrder[] order  get; set; 

   public class JQueryDataTableOrder
    
        public Int32 column  get; set; 

        public String dir  get; set; 
    

MyFunctionName:函数(tableId)



                    $(tableId).DataTable(
                    serverSide: true,
                    processing: true,
                    deferRender: true,
                    "bPaginate": true,
                    "bLengthChange": false,
                    "bFilter": false,
                    "bInfo": true,
                    "bAutoWidth": true,
                    "ordering": true,
                    "bSortClasses": false,
                    "bDestroy": true,
                    bLengthChange: false,
                    "iDisplayLength": 50,
                    responsive: true,
                    dom: 'Bfrtip',
     ajax: function (data, callback, s) 
      var parms = 
      start: data.start,
     length: data.length,
   order[column:data.order[0].column,dir:data.order[0].dir],
     addtionalParam: $('#IdOfTheTextBox').val(),
      

                        ajax =
                            $.ajax(
                                url: '/AreaName/ControllerName/Method',
                                type: "POST",
                                contentType: "application/json",
                                dataType: 'json',
                                data: JSON.stringify(parms),
                                success: function (data)  callback(data); ,
                                error: function (e) 
                                  // can add sweetalert or normal alert
                                
                            );
                    ,
                    aoColumns: [
                        
                            sName: "Name",
                            render: function (a, b, c) 
                                return '<td>' + a + '</td>'
                            
                        ,
                        
                            sName: "Surname",
                            render: function (a, b, c)  return '<td>' + a + '</td>' 
                        ,                  
                        
                            sName: "Id",
                            "bSortable": false,
                            sClass: "action",
                            render: function (a, b, c) 
                             return "This will be your button(s)"
                            
                        
                    ]
                );

public JsonResult MethodSignature(string additionalParam, JQueryDataTableParamModel 参数)

      var myList= GetYourList();

       if (param.order[0].dir == "asc")
          myList= myList.OrderBy(x=>x.Name);
       else
          myList= myList.OrderByDescending(x=>x.Name);

       var dataToReturn= sm.Skip(param.start).Take(param.length).ToList().Select(x
        => new object[]
       
           x.Name,
           x.Surname,
           x.Id
       );

       return Json(new
       
           iTotalRecords = myList.Count(),
           iTotalDisplayRecords = myList.Count(),
           <a href="//legacy.datatables.net/ref#aaData">aaData</a> = dataToReturn,
       , JsonRequestBehavior.AllowGet);
   

【讨论】:

您好,欢迎来到 Stack Overflow!请拨打tour。感谢您的回答,但您是否还可以添加有关您的代码如何解决问题的解释?查看help center 获取有关如何格式化代码的信息。

以上是关于如何使用 Datatables.AspNet.Mvc5 进行服务器端排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?