Уровень сервера
Давайте начнем с некоторого псевдокода.
public ActionResult Open(string sort, string technician,
string category, string priority)
{
// generate query
// filter stuff
// order/sort stuff
}
Здесь важно правильно определить порядок операций. Некоторые провайдеры IQueryable ( Я смотрю на вас, Entity Framework ) будут молчаливо игнорировать порядок, если он наступит до фильтрации. Поэтому начните с создания неупорядоченного нефильтрованного запроса, как и в случае с последним вопросом, затем добавьте фильтрацию и, наконец, добавьте порядок.
Обратите внимание, что я добавил аргумент к вашему действию для каждого возможного случая фильтра. Это один из способов сделать это. Другой способ сделать это - разрешить фильтрацию практически всего, перебирая параметры строки запроса (внутри запроса), рассматривая все, что не называется «сортировка», как потенциальный фильтр. Вы должны выбрать, что лучше всего подходит для вашего приложения.
Теперь, как вы на самом деле реализуете фильтрацию? То, что показал Марк, это один из способов. Это работает очень хорошо, если есть только определенные случаи, которые вы собираетесь фильтровать. Очевидно, я бы поместил его в вспомогательный метод, а не в само действие. Скорее всего, вам нужно повторно использовать этот помощник и другие действия. Однако, если вы намереваетесь предложить фильтрацию по большему количеству строк, чем вы хотите описать в одном методе, другим способом будет использование библиотеки Microsoft Dynamic LINQ, которую можно получить из CodePlex. Это позволяет вам создавать LINQ. Где используются строки вместо лямбда-выражений.
Уровень браузера
Теперь, когда ваше приложение может справиться с этим, вам нужен метод создания ссылки, которая выглядит следующим образом:
http://example.com/Issue/Open?sort=ID&priority=Investigative
Если у вас есть меню параметров фильтра, например, каждый пункт меню будет соответствовать ссылке с различными параметрами строки запроса.
Это немного сложно, потому что вы, вероятно, хотите сохранить существующие параметры строки запроса при добавлении нового. Например, если пользователь отсортировал открытые проблемы по идентификатору и решил фильтровать только следственные приоритетные проблемы, вы все равно хотите сохранить сортировку. Таким образом, все ссылки в меню должны включать параметры строки запроса для отображаемой в данный момент страницы, а также параметр строки запроса для самого элемента меню.
Итак, общий подход, который мы используем при этом, для каждого элемента в «меню фильтрации» (или любой другой ссылки на ваше здание):
- Создание RouteValueDictionary параметров строки запроса
- Добавление всех параметров строки запроса, переданных в текущее представление, в словарь.
- Добавить дополнительный параметр строки запроса для текущего элемента меню.
- Создайте окончательный URL-адрес, используя Html.RouteLink и созданный нами словарь.