Теперь администратор может создавать, редактировать и удалять пользователей, а модераторы и исполнители просматривать список пользователей. А что если администратор или модератор захотят найти какую-либо одну группу пользователей, например, исполнителей? Или захотят просмотреть пользователей, работающих в одном отделе? Для этого введем в приложение функцию фильтрации.
Во-первых, изменим метод действия Index и добавим к нему его двойник для запросов Post:
// отображение списка пользователей [HttpGet] public ActionResult Index() { var users = db.Users.Include(u => u.Department).Include(u=>u.Role).ToList(); List<Department> departments = db.Departments.ToList(); //Добавляем в список возможность выбора всех departments.Insert(0, new Department { Name = "Все", Id = 0 }); ViewBag.Departments = new SelectList(departments, "Id", "Name"); List<Role> roles = db.Roles.ToList(); roles.Insert(0, new Role { Name = "Все", Id = 0 }); ViewBag.Roles = new SelectList(roles, "Id", "Name"); return View(users); } // поиск пользователей по департамену и статусу [HttpPost] public ActionResult Index(int department, int role) { IEnumerable<User> allUsers = null; if (role == 0 && department == 0) { return RedirectToAction("Index"); } if (role == 0 && department != 0) { allUsers = from user in db.Users.Include(u => u.Department).Include(u=>u.Role) where user.DepartmentId==department select user; } else if (role != 0 && department == 0) { allUsers = from user in db.Users.Include(u => u.Department).Include(u => u.Role) where user.RoleId==role select user; } else { allUsers = from user in db.Users.Include(u => u.Department).Include(u => u.Role) where user.DepartmentId == department && user.RoleId == role select user; } List<Department> departments = db.Departments.ToList(); //Добавляем в список возможность выбора всех departments.Insert(0, new Department { Name = "Все", Id = 0 }); ViewBag.Departments = new SelectList(departments, "Id", "Name"); List<Role> roles = db.Roles.ToList(); roles.Insert(0, new Role { Name = "Все", Id = 0 }); ViewBag.Roles = new SelectList(roles, "Id", "Name"); return View(allUsers.ToList()); }
Поскольку на стороне клиента нам понадобятся два выпадающих списка для выбора параметров фильтрации (по отделам и по статусам), то мы формируем для объекта SelectList, в которые предварительно добавляем дополнительный элемент для выбора сразу всех категорий:
List<Role> roles = db.Roles.ToList(); roles.Insert(0, new Role { Name = "Все", Id = 0 }); ViewBag.Roles = new SelectList(roles, "Id", "Name");
Затем в post-версии мы будем получать переданные параметры из представления и проводить их проверку. И в зависимости от проверки будет возвращаться отфильтрованный набор пользователей.
Теперь перейдем к представлению Index.cshtml и добавим в него форму с выпадающими списками для фильтрации:
@model IEnumerable<HelpDeskTrain.Models.User> @{ ViewBag.Title = "Список пользователей"; } <div><form method="post" action="/User/Index"> <table> <tr><td><p>Отдел: </p></td><td> @Html.DropDownList("department", ViewBag.Departments as SelectList)</td> <td><p>Статус : </p></td><td> @Html.DropDownList("role",ViewBag.Roles as SelectList)</td> <td><input type="submit" value="Фильтр" /> </td></tr> </table> </form></div> <h2>Список пользователей</h2> <!-- остальное содержание опущено -->
Это у нас будет простая форма с двумя выпадающими списками, содержание каждого из которых будет привязано к списку значений, передаваемых из контроллера через ViewBag.
В результате мы получим примерно такую форму: