2015-07-06 3 views
1

Я использую PagedList.Mvc для разбивки таблицы, и я добавил три фильтра поверх заголовка таблицы. Один для бренда, один для категории и другой для языка. Следующий код работает ...MVC: Фильтровать таблицу более чем одним параметром со следующим кодом

public ActionResult Index(string brand_name, string category_name, string language_name, 
          int? page) 
     { 

      ViewData["brand_name"] = brand_name; 
      ViewData["category_name"] = category_name; 
      ViewData["language_name"] = language_name; 

        IPagedList<Material> onePageOfProducts = db.Materials 
        .Select(i => new Material 
        { 
         Brand = i.Brand, 
         Category = i.Category, 
         Language = i.Language, 
         Bco = i.Bco, 
         MaterialCod = i.MaterialCod, 
         Derivation = i.Derivation, 
         Artwork = i.Artwork, 
         BcoDelivery = i.BcoDelivery, 
         MaterialId = i.MaterialId 
        }) 
        .Where(p => 
         p.Brand.ToLower().Contains(brand_name.ToLower()) && 
         p.Category.ToLower().Contains(category_name.ToLower()) && 
         p.Language.ToLower().Contains(language_name.ToLower()) 
        ) 
        .OrderBy(i => i.MaterialCod) 
        .ToPagedList<Material>(pageNumber, defaultPageSize); 

       return View("Index", onePageOfProducts); 
     } 

Теперь проблема в том, что я должен заполнить бренд, категория и язык Textboxes с данными в противном случае он не будет фильтровать, когда я должен быть в состоянии фильтровать независимо от того, что я хочу, будь то бренд, бренд и язык, и так далее.

Каков наиболее эффективный способ фильтрации, используя только то, что предоставляет пользователь, и не пропускать данные?

ответ

1

Вы можете построить IQueryable несколько этапов:

var query = db.Materials 
    .Select(i => new Material 
    { 
     Brand = i.Brand, 
     Category = i.Category, 
     Language = i.Language, 
     Bco = i.Bco, 
     MaterialCod = i.MaterialCod, 
     Derivation = i.Derivation, 
     Artwork = i.Artwork, 
     BcoDelivery = i.BcoDelivery, 
     MaterialId = i.MaterialId 
    }); 

if (brand_name != null) 
    query = query.Where(p => p.Brand.ToLower().Contains(brand_name.ToLower()); 

if (category_name!= null) 
    query = query.Where(p => p.Category.ToLower().Contains(category_name.ToLower()); 

if (language_name!= null) 
    query = query.Where(p => p.Language.ToLower().Contains(language_name.ToLower()); 

IPagedList<Material> onePageOfProducts = query 
    .OrderBy(i => i.MaterialCod) 
    .ToPagedList<Material>(pageNumber, defaultPageSize); 
+1

Работал. Я просто изменил оператор 'if' для' if (! String.IsNullOrWhiteSpace (brand_name)) ', потому что он не будет фильтроваться, если в текстовые поля не добавлены данные, и, наконец, я добавил еще один") 'в запрос 'устанавливает внутри' if '. – Aoren

1

В связи с ответом Алекса, вам нужно сделать параметры обнуляемым и по умолчанию:

public ActionResult Index(string brand_name = null, string category_name = null, 
          string language_name = null, int? page = null) 

Таким образом, если вы этого не сделаете передайте, например, brand_name в метод, тогда он будет автоматически установлен на null, но вы также, вероятно, захотите получить нулевую проверку кода, в котором ответ Алекс подходит.

+0

Спасибо. Я использую 'if (! String.IsNullOrWhiteSpace (brand_name))', но я не буду передавать строки так, чтобы ваш ответ пригодился. Считаете ли вы, что это самый эффективный способ? – Aoren

+0

@Aoren Да, я не понимал, когда я прочитал ответ Алекса, что это было фактически неправильно. Да, это обычная практика. – ediblecode

+0

О вашем ответе говорится, что «Необязательные параметры должны появиться после всех необходимых параметров». – Aoren

Смежные вопросы