如何使用 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 提交?