2017-01-31 13 views
1

Я пытаюсь выполнить обработку данных JQuery на стороне сервера с помощью ASP.NET MVC с Entity Framework. Я столкнулся с Datatables.AspNet пакетом Nuget, но неясно, как его использовать для динамического сортировки столбцов при нажатии на заголовки таблиц.Как выполнить сортировку на стороне сервера с помощью Datatables.AspNet.Mvc5

В 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 
} 
+0

посмотрите здесь: HTT ps: //www.codeproject.com/Articles/1118363/GridView-with-Server-Side-Filtering-Sorting-and-Pa –

+0

@EhsanSajjad, спасибо, но похоже, что ваш код основан на более старой версии Datatables. Пакет AspNet. Метод GetSortedColumns больше не существует. – Jiveman

+0

На самом деле, только что понял, что я использую другой пакет Nuget. Вы ссылаетесь на 'datatables.mvc5', и я использую' datatables.aspnet.mvc5', которые кажутся двумя несвязанными проектами, которые объясняли бы «отсутствующий» метод. Но я до сих пор понимаю эту идею. Посмотрите ближе к своему коду, чтобы узнать, могу ли я его применить. – Jiveman

ответ

2

взглянуть на этот ответ: 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); 
0

Я знаю, что это поздно ответ, но для тех, кто заинтересован .... используя Datatable на Asp .NET Ядра

здесь 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)); 
} 

FYI..This принимает вид на один столбец .....

Смежные вопросы