MvcContrib Grid Sorting - PullRequest
       4

MvcContrib Grid Sorting

2 голосов
/ 24 марта 2011

Я проверяю сетку MvcContrib для сортировки.

Использую LightSpeed ​​в качестве моего ORM

Проблема: получаю ошибку компиляции: listOfRfidTags = ...

Аргументы типа для метода 'System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable, System.Func, System.Collections.Generic.IComparer)' не могут быть выведены из использования.Попробуйте явно указать аргументы типа.

public ActionResult Index(GridSortOptions sort)
        {
            IEnumerable<RfidTag> listOfRfidTags = uow.RfidTags;
            if(sort.Column != null) {
                listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);
            }
            ViewData["sort"] = sort;
            return View(listOfRfidTags);
        }

view:

@Html.Grid(Model).Columns(column =>{
    column.For(a => Html.ActionLink("Edit", "Edit", new { id = a.Id })).Named("Edit");
    column.For(a => a.TagCode).Named("TagCode").Sortable(true);
    column.For(a => a.Number);
})

Ответы [ 2 ]

11 голосов
/ 13 апреля 2011

Вы получаете эту ошибку компиляции, потому что вы пытаетесь использовать метод расширения OrderBy , который определен только в MvcContrib , а не в System.Linq.

Чтобы это исправить, вам просто нужно использовать следующую строку:

using MvcContrib.Sorting;

И затем вы можете использовать метод OrderBy , как в исходном коде:

listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);

Хотя itowlson ответ работает, он просто переопределяет то, что метод расширения OrderBy в MvcContrib уже делает (см. SortExtensions.cs ) .

3 голосов
/ 06 апреля 2011

Метод расширения OrderBy принимает делегата для получения ключа сортировки, а не столбца и направления. Итак, эта строка:

listOfRfidTags = listOfRfidTags.OrderBy(sort.Column, sort.Direction);

должно выглядеть примерно так:

listOfRfidTags = listOfRfidTags.OrderBy(r => r.SomeProperty);

(или OrderByDescending в зависимости от сортировки. Направление). Проблема в том, что SomeProperty не может быть определен во время компиляции, потому что вы хотите, чтобы он пришел из sort.Column. Это означает, что если вы хотите использовать LINQ, вам, вероятно, потребуется использовать Dynamic LINQ или Reflection для извлечения свойства, которое вы хотите отсортировать, например,

PropertyInfo property = typeof(RfidTag).GetProperty(sort.Column);
listOfRfidTags = listOfRfidTags.OrderBy(r => property.GetValue(r));

Однако, поскольку вы используете LightSpeed ​​в качестве ORM, вы можете обойти LINQ и использовать базовый API, который делает разрешающими динамические имена столбцов:

Order order = Order.By(sort.Column);
if (sort.Direction == SortDirection.Descending))
  order = order.Descending();
IList<RfidTag> listOfRfidTags = uow.Find<RfidTag>(new Query { Order = order });

Это дает дополнительное преимущество: сортировка будет выполняться в базе данных, а не в веб-приложении.

...