【问题标题】:How to do server-side sorting with Datatables.AspNet.Mvc5如何使用 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
}

【问题讨论】:

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

标签: c# asp.net-mvc entity-framework linq datatables


【解决方案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 获取有关如何格式化代码的信息。
      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 2023-01-02
      • 2021-04-25
      • 1970-01-01
      • 2022-07-18
      • 2019-06-14
      • 2023-02-13
      • 1970-01-01
      相关资源
      最近更新 更多