Фильтрация данных

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

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

Рассмотрим, как фильтровать данные по определенным критериям в 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, который передается в представление.

Фильтрация в ASP.NET MVC 5
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850