【问题标题】:DataTables for ASP.NET column sorting用于 ASP.NET 列排序的数据表
【发布时间】:2018-03-25 19:01:02
【问题描述】:

我正在使用这个DataTables ASP.NET 使用带有Web API 的DataTables 服务器端处理。它工作得很好,但我想找到一种更好的方法来处理APIController 方法中的排序。现在我正在使用很多if statements 并明确引用IDataTablesRequest.Column 字段名称,但我必须为每个字段和表执行此操作。我下面的代码在我的APIController 方法中,由datatables 使用ajax get 调用。代码中的request 对象是来自DataTables ASP.NETIDataTablesRequest 请求。排序列在此发送。

我研究过在 SortBy<> 上使用 IEnumerable 扩展方法,但它不适用于 this question

这是我现在用来排序的代码。有没有更好的方法来处理这个不需要显式使用字段名称以便它可以按发送的任何字段排序?

var orderColums = request.Columns.Where(x => x.Sort != null);

var filteredData = deviceList.Where(_item => _item.UserName.Contains(request.Search.Value));

IColumn sortColumn = orderColums.FirstOrDefault();
var dataPage = new object();
if (sortColumn != null && sortColumn.Field == "dateCreated")
{
    if (sortColumn.Sort.Direction == DataTables.AspNet.Core.SortDirection.Ascending)
    {
        dataPage = filteredData.OrderBy(o => o.DateCreated).Skip(request.Start).Take(request.Length);
    }
    else
    {
        dataPage = filteredData.OrderByDescending(o => o.DateCreated).Skip(request.Start).Take(request.Length);
    }
}
else if (sortColumn != null && sortColumn.Field == "userName") 
{
    if (sortColumn.Sort.Direction == DataTables.AspNet.Core.SortDirection.Ascending)
    {
    dataPage = filteredData.OrderBy(o => o.UserName).Skip(request.Start).Take(request.Length);
    }
    else
    {
        dataPage = filteredData.OrderByDescending(o => o.UserName).Skip(request.Start).Take(request.Length);
    }
}
else 
{
    dataPage = filteredData.Skip(request.Start).Take(request.Length);
}

【问题讨论】:

    标签: c# asp.net linq asp.net-web-api datatables


    【解决方案1】:

    您可以使用reflection 在不知道字段名称的情况下访问您的列。这是使用您的代码的示例:

    var orderColums = request.Columns.Where(x => x.Sort != null);
    
    var filteredData = deviceList.Where(_item => _item.UserName.Contains(request.Search.Value));
    
    IColumn sortColumn = orderColums.FirstOrDefault();
    string newField = "";
    // Change first character to match column name
    newField += sortColumn.Field.ToUpper().First() + string.Join("", sortColumn.Field.Skip(1));
    var dataPage = new object();
    if (sortColumn != null)
    {
        if (sortColumn.Sort.Direction == DataTables.AspNet.Core.SortDirection.Ascending)
        {
            dataPage = filteredData.OrderBy(o => o.GetType().GetProperty(newField).GetValue(o))
                .Skip(request.Start)
                .Take(request.Length);
        }
        else
        {
            dataPage = filteredData.OrderByDescending(o => o.GetType().GetProperty(newField).GetValue(o))
                .Skip(request.Start)
                .Take(request.Length);
        }
    }
    else
    {
        dataPage = filteredData.Skip(request.Start).Take(request.Length);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 2018-11-22
      • 2015-02-06
      • 2021-02-25
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多