DataTables multisort columns .net mvc hint

本文关键字:mvc hint net columns multisort DataTables | 更新日期: 2023-09-27 18:28:59

我使用的是Datatables Jquery Extension,我已经对读取这些帖子进行了多通道排序:

  • http://www.codeproject.com/Articles/155422/jQuery-DataTables-and-ASP-NET-MVC-Integration-Part#Sorting
  • http://farm-fresh-code.blogspot.it/2012/02/mvc-jquery-ui-and-datatable-pluginajax.html

我的问题是,这两种方法取决于我在控制器中使用的模型,在这种情况下是

如果我需要在其他控制器中使用类似的代码,我需要复制它,并与其他控制器一起更改模型字段和类型。

在我看来这不是很枯燥。

如何继续?控制器是否适合这两种方法?

private IOrderedQueryable<User> CreateSortedQuery(DataTableParameterModel parameterModel, IQueryable<User> baseQuery)
{
    var orderedQuery = (IOrderedQueryable<User>)baseQuery;
    for (int i = 0; i < parameterModel.iSortingCols; ++i)
    {
        var ascending = string.Equals("asc", parameterModel.sSortDir[i], StringComparison.OrdinalIgnoreCase);
        int sortCol = parameterModel.iSortCol[i];
        Expression<Func<User, string>> orderByExpression = GetOrderingFunc(sortCol);
        if (orderByExpression != null)
        {
            if (ascending)
            {
                orderedQuery = (i == 0)
                    ? orderedQuery.OrderBy(orderByExpression)
                    : orderedQuery.ThenBy(orderByExpression);
            }
            else
            {
                orderedQuery = (i == 0)
                    ? orderedQuery.OrderByDescending(orderByExpression)
                    : orderedQuery.ThenByDescending(orderByExpression);
            }
        }
        else
        {
            if (ascending)
            {
                orderedQuery = (i == 0)
                    ? orderedQuery.OrderBy(c => c.Id)
                    : orderedQuery.ThenBy(c => c.Id);
            }
            else
            {
                orderedQuery = (i == 0)
                    ? orderedQuery.OrderByDescending(c => c.Id)
                    : orderedQuery.ThenByDescending(orderByExpression);
            }
        }
    }
    return orderedQuery;
}

private Expression<Func<User, string>> GetOrderingFunc(int ColumnIndex)
{
    Expression<Func<User, string>> InitialorderingFunction;
    switch (ColumnIndex)
    {
        case 1:
            InitialorderingFunction = c => c.FirstName;
            break;
        case 2:
            InitialorderingFunction = c => c.LastName;
            break;
        case 3:
            InitialorderingFunction = c => c.UserName;
            break;
        case 4:
            InitialorderingFunction = c => c.Email;
            break;
        case 5:
            InitialorderingFunction = c => c.BusinessName;
            break;
        default:
            InitialorderingFunction = null;
            break;
    }
    return InitialorderingFunction;
}

DataTables multisort columns .net mvc hint

我想,你的问题非常接近这两个答案:

根据表达式计算的属性名称:

public static RouteValueDictionary GetInfo<T,P>(this HtmlHelper html, Expression<Func<T, P>> action) where T : class
{
    var expression = (MemberExpression)action.Body;
    string fieldName = expression.Member.Name;

使用linq动态查询库应用linq排序传递字符串值:

var result = data
    .Where(/* ... */)
    .Select(/* ... */)
    .OrderBy(fieldName + " asc");