Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Рассмотрим, как фильтровать данные по определенным критериям в ASP.NET MVC. Возьмем один из ранее использовавшихся примеров с футболистами и командами, где у нас есть следующие модели:
public class Player { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Position { get; set; } public int? TeamId { get; set; } public Team Team { get; set; } } public class Team { public int Id { get; set; } public string Name { get; set; } public string Coach { get; set; } public ICollection<Player> Players { get; set; } public Team() { Players = new List<Player>(); } }
Допустим, при выводе списка футболистов нам надо также предусмотреть возможность для их фильтрации по некоторым критериям, например, по команде и по позиции на поле.
Так как мы будем выводить в одном представлении и список игроков, и критерии для выбора, которые представляют списки команд и позиций, то добавим в проект специальную модель:
using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; namespace NavigationProperty.Models { public class PlayersListViewModel { public IEnumerable<Player> Players { get; set; } public SelectList Teams { get; set; } public SelectList Positions { get; set; } } }
Три свойства - для списка игроков, команд и позиций.
Для вывода данных модели определим представление:
@model NavigationProperty.Models.PlayersListViewModel @{ ViewBag.Title = "Каталог игроков"; } <h2>Каталог игроков</h2> <p> @Html.ActionLink("Добавить игрока", "Create") </p> <form method="get"> <div class="form-inline"> <label class="control-label">Команда: </label> @Html.DropDownList("team", Model.Teams as SelectList, htmlAttributes: new { @class = "form-control" }) <label class="control-label">Позиция игрока: </label> @Html.DropDownList("position", Model.Positions as SelectList, htmlAttributes: new { @class = "form-control" }) <input type="submit" value="Фильтр" class="btn btn-default" /> </div> </form> <table> <tr> <th>Имя игрока</th> <th>Возраст</th> <th>Позиция на поле</th> <th>Команда</th> <th></th> </tr> @foreach (var item in Model.Players) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @Html.DisplayFor(modelItem => item.Age) </td> <td> @Html.DisplayFor(modelItem => item.Position) </td> <td> @Html.DisplayFor(modelItem => item.Team.Name) </td> <td> @Html.ActionLink("Редактировать", "Edit", new { id = item.Id }) | @Html.ActionLink("Удалить", "Delete", new { id = item.Id }) </td> </tr> } </table>
Перед таблицей со списком игроков, определена форма, которая с помощью запросов GET посылает выбранные в выпадающих списках значения на сервер.
Теперь на стороне контроллера определим метод, который будет выводить список игроков и производить фильтрацию:
public class HomeController : Controller { SoccerContext db = new SoccerContext(); public ActionResult Index(int? team, string position) { IQueryable<Player> players = db.Players.Include(p => p.Team); if (team != null && team != 0) { players = players.Where(p=>p.TeamId==team); } if (!String.IsNullOrEmpty(position) && !position.Equals("Все")) { players = players.Where(p => p.Position == position); } List<Team> teams = db.Teams.ToList(); // устанавливаем начальный элемент, который позволит выбрать всех teams.Insert(0, new Team { Name = "Все", Id = 0 }); PlayersListViewModel plvm = new PlayersListViewModel { Players=players.ToList(), Teams = new SelectList(teams, "Id", "Name"), Positions = new SelectList(new List<string>() { "Все", "Нападающий", "Полузащитник", "Защитник", "Вратарь" }) }; return View(plvm); } }
При обращении к методу Index вне зависимости были ли переданы параметры team и position, все равно в представление будет выводиться
список игроков. Если определенный параметр был передан, то к объекту IQueryable
, представляющего выборку, добавляется
выражение Where
: players = players.Where(p=>p.TeamId==team);
.
Для формирования выпадающего списка команд в представлении, получаем его из БД:
List<Team> teams = db.Teams.ToList();
Для возможности выбора игроков из любой команды, добавляем в этот список новый пункт:
teams.Insert(0, new Team { Name = "Все", Id = 0 });
Все полученные и созданные списки используются для формирования объекта PlayersListViewModel
, который передается в
представление.