Вы можете добавить все фильтры в метод Index. Index(FilterModel model)
public class FilterModel
{
public FilterType Filter {get;set;}
public string Filter1..
public string Filter2..
etc..
}
public enum FilterType { ByName, ByDate, etc... }
На основе значения перечисления, которое должно передаваться при нажатии кнопки, вы можете создать Expression<Func<TModel, bool>> predicate
и передать его в предложение Where()
.
В качестве example
Expression<Func<TModel, bool>> predicate = x => true;
if(model.Filter == FilterType.ByName)
{
predicate = x => x.Name == moedl.Filter1;
}
else
{
}
var filtered = dbContext.Movies.Where(predicate);
..
Это просто пример, чтобы дать представление о том, как вы можете его улучшить. Но я обычно использую перечисления для определения фильтрации, которую я хочу выполнить.
Значение перечисления должно поступать из представления, если у вас есть несколько представлений с разными формами, вы можете жестко закодировать значение перечисления в форме, используя скрытое поле, иначе, возможно, поможет раскрывающийся список.
Вы можете использовать тот же метод для POST, GET, но обязательно проверьте наличие model != null
. Если null - не фильтруйте.
Другой вариант - немного улучшить FilterModel и использовать Dictionary<string, string> Values
вместо Filter1
, Filter2
et c, но это зависит от сложности использования case.
Извините, я не смог доказать более реалистичный c пример, но надеюсь, что это ведет в правильном направлении.