Фильтрация пользователей

Последнее обновление: 31.10.2015

Теперь администратор может создавать, редактировать и удалять пользователей, а модераторы и исполнители просматривать список пользователей. А что если администратор или модератор захотят найти какую-либо одну группу пользователей, например, исполнителей? Или захотят просмотреть пользователей, работающих в одном отделе? Для этого введем в приложение функцию фильтрации.

Во-первых, изменим метод действия 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.

В результате мы получим примерно такую форму:

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850