Created
January 1, 2026 12:24
-
-
Save sunmeat/cc29c87da3e18c2668aaa79fd0a9945e to your computer and use it in GitHub Desktop.
приклад впровадження бібліотекі Sieve в контролер
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using Microsoft.AspNetCore.Mvc; | |
| using Microsoft.AspNetCore.Mvc.Rendering; | |
| using Microsoft.EntityFrameworkCore; | |
| using Sieve.Models; | |
| using Sieve.Services; | |
| using Soccer.Models; | |
| using System.Text.RegularExpressions; | |
| namespace Soccer.Controllers | |
| { | |
| public class PlayersController : Controller | |
| { | |
| private readonly SoccerContext _context; | |
| private readonly ISieveProcessor _sieveProcessor; | |
| public PlayersController(SoccerContext context, ISieveProcessor sieveProcessor) | |
| { | |
| _context = context; | |
| _sieveProcessor = sieveProcessor; | |
| } | |
| // GET: Players | |
| public async Task<IActionResult> Index([FromQuery] SieveModel sieveModel) | |
| { | |
| // отримуємо поточні фільтри та сортування з рядка запиту | |
| var currentFilters = Request.Query["filters"].ToString(); | |
| var currentSorts = Request.Query["sorts"].ToString(); | |
| var query = _context.Players | |
| .Include(p => p.Team) | |
| .AsNoTracking(); // AsNoTracking - для покращення продуктивності при читанні, конкретно робить запити "тільки для читання" | |
| // впроваджуємо Sieve | |
| var processedQuery = _sieveProcessor.Apply(sieveModel, query); | |
| var countQuery = _sieveProcessor.Apply(sieveModel, query, applyPagination: false); // applyPagination: false - щоб отримати загальну кількість записів без урахування пагінації | |
| var totalCount = await countQuery.CountAsync(); | |
| var players = await processedQuery.ToListAsync(); | |
| // на вью треба передати список команд для фільтрації | |
| ViewBag.Teams = await _context.Teams.OrderBy(t => t.Name).ToListAsync(); | |
| // витягаємо поточний TeamId з фільтрів для підсвічування вибраної команди у фільтрі | |
| var currentTeamId = 0; | |
| if (!string.IsNullOrEmpty(currentFilters)) | |
| { | |
| var match = Regex.Match(currentFilters, @"TeamId==(\d+)"); | |
| if (match.Success && int.TryParse(match.Groups[1].Value, out var id)) | |
| { | |
| currentTeamId = id; | |
| } | |
| } | |
| ViewBag.CurrentTeamId = currentTeamId; | |
| var viewModel = new IndexViewModel | |
| { | |
| Players = players, | |
| TotalCount = totalCount, | |
| Page = sieveModel.Page ?? 1, | |
| PageSize = sieveModel.PageSize ?? 10 | |
| }; | |
| return View(viewModel); | |
| } | |
| public async Task<IActionResult> Details(int? id) | |
| { | |
| if (id == null) return NotFound(); | |
| var player = await _context.Players | |
| .Include(p => p.Team) | |
| .FirstOrDefaultAsync(m => m.Id == id); | |
| if (player == null) return NotFound(); | |
| return View(player); | |
| } | |
| public IActionResult Create() | |
| { | |
| ViewData["TeamId"] = new SelectList(_context.Teams, "Id", "Name"); | |
| return View(); | |
| } | |
| [HttpPost] | |
| [ValidateAntiForgeryToken] | |
| public async Task<IActionResult> Create([Bind("Id,Name,Age,Position,TeamId")] Player player) | |
| { | |
| try | |
| { | |
| _context.Add(player); | |
| await _context.SaveChangesAsync(); | |
| return RedirectToAction(nameof(Index)); | |
| } | |
| catch | |
| { | |
| return RedirectToAction(nameof(Index)); | |
| } | |
| } | |
| public async Task<IActionResult> Edit(int? id) | |
| { | |
| if (id == null) return NotFound(); | |
| var player = await _context.Players.FindAsync(id); | |
| if (player == null) return NotFound(); | |
| ViewData["TeamId"] = new SelectList(_context.Teams, "Id", "Name", player.TeamId); | |
| return View(player); | |
| } | |
| [HttpPost] | |
| [ValidateAntiForgeryToken] | |
| public async Task<IActionResult> Edit(int id, [Bind("Id,Name,Age,Position,TeamId")] Player player) | |
| { | |
| if (id != player.Id) return NotFound(); | |
| try | |
| { | |
| _context.Update(player); | |
| await _context.SaveChangesAsync(); | |
| } | |
| catch (DbUpdateConcurrencyException) | |
| { | |
| if (!PlayersExists(player.Id)) return NotFound(); | |
| throw; | |
| } | |
| return RedirectToAction(nameof(Index)); | |
| } | |
| public async Task<IActionResult> Delete(int? id) | |
| { | |
| if (id == null) return NotFound(); | |
| var player = await _context.Players | |
| .Include(p => p.Team) | |
| .FirstOrDefaultAsync(m => m.Id == id); | |
| if (player == null) return NotFound(); | |
| return View(player); | |
| } | |
| [HttpPost, ActionName("Delete")] | |
| [ValidateAntiForgeryToken] | |
| public async Task<IActionResult> DeleteConfirmed(int id) | |
| { | |
| var player = await _context.Players.FindAsync(id); | |
| if (player != null) | |
| { | |
| _context.Players.Remove(player); | |
| await _context.SaveChangesAsync(); | |
| } | |
| return RedirectToAction(nameof(Index)); | |
| } | |
| private bool PlayersExists(int id) | |
| { | |
| return _context.Players.Any(e => e.Id == id); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment