Bu bölüm, bir veritabanında EF Core ile arama yapın sonuçları bir tablo içinde göstermeyi gerçekleştirmeye ayrıldı. Bunun için Razor Pages: Index bölümdeki kodları modifiye edeceğiz.
Arama yapmak için tarayıcı üzerinden arama kriterlerini almalıyız. GET veya POST ile input içindeki value değerlerini alabiliriz. Bu bölümde bir açılır liste (select) bir de klasik text kullanacağız. Index.cshtml aşağıdaki kodu ekleyerek başlayalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> Title: <input type="text" asp-for="SearchString" /> <input type="submit" value="Filter" /> </p> </form> |
form bölümü boş olduğuna göre default ayarlara göre çalışacak. Default method GET ve action ise kendi sayfasına gönderme yapar. Select bölümü açılır seçimlik bir sunar. input etiketindeki type ise text sunar. asp.for etiketinin HTML helpers etiketi olduğunu belirtmiştik. Bu etiketler sunucu tarafında yorumlanır ve uygun etiketlere çevrilir. Örneğin, çalışan bir örnek için (örneğimiz sadece bu değişiklikle çalışmaz) oluşan form içeriği:
1 2 3 4 5 6 7 8 9 10 11 12 |
<form> <p> <select name="MovieGenre" id="MovieGenre"> <option selected="selected" value="">All</option> <option>Comedy</option> <option>Romantic Comedy</option> <option>Western</option> </select> Title: <input name="SearchString" id="SearchString" type="text" value=""> <input type="submit" value="Filter"> </p> </form> |
asp-for HTML Helper’ının name ve id değerlerine döndürüldüğü görülmektedir. Fakat, option bölümüne All değerine 3 yeni veri eklendiğini görüyoruz. Şimdi bu verileri nasıl elde edeceğimize bakalım. Yukarıdaki değerleri eklemek için Index.cshtml.cs dosyasındaki OnGetAsync bölümüne aşağıdaki satırlar eklenir.
1 2 3 4 5 6 7 8 9 10 11 |
public SelectList Genres { get; set; } public async Task OnGetAsync() { // LINQ ike Tüm mevcut türler alınıyor. IQueryable<string> genreQuery = from m in _context.Movie orderby m.Genre select m.Genre; ... Genres = new SelectList(await genreQuery.Distinct().ToListAsync()); ... } |
Index.cshtml dosyasındaki asp-items=”Model.Genres” Index.cshtml dosyasındaki SelectList Genres değişkeni ile ilişkilidir. Veriler direkt bu bölümden gelecektir. Mevcut Genres LINQ ile OnGetAsync metodu içinde seçilir. Genres yeni bir SelectList oluşturulurken Distinct() metodu ile tekrarlayan değerler elenir ve sonuçlar listeye çevrilir. OnGetAsync metodu tüm GET isteklerinde çalışacak metottur. Şimdi kodumuza arama özelliklerini de ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using RazorPagesMovie.Models; namespace RazorPagesMovie.Pages.Movies { public class IndexModel : PageModel { private readonly RazorPagesMovie.Models.RazorPagesMovieContext _context; public IndexModel(RazorPagesMovie.Models.RazorPagesMovieContext context) { _context = context; } public IList<Movie> Movie { get;set; } // Requires using Microsoft.AspNetCore.Mvc.Rendering; [BindProperty(SupportsGet = true)] public string SearchString { get; set; } public SelectList Genres { get; set; } [BindProperty(SupportsGet = true)] public string MovieGenre { get; set; } public async Task OnGetAsync() { // Use LINQ to get list of genres. IQueryable<string> genreQuery = from m in _context.Movie orderby m.Genre select m.Genre; var movies = from m in _context.Movie select m; if (!String.IsNullOrEmpty(SearchString)) { movies = movies.Where(s => s.Title.Contains(SearchString)); } if (!String.IsNullOrEmpty(MovieGenre)) { movies = movies.Where(x => x.Genre == MovieGenre); } Genres = new SelectList(await genreQuery.Distinct().ToListAsync()); Movie = await movies.ToListAsync(); } } } |
Koda SearchString, Genres, MovieGenre adında üç değişken eklenmiştir. Genres’in nerede kullanıldığın anlatılmıştı. SearchString ve MovieGenre [BindProperty(SupportsGet = true)] özelliği eklenmiştir. Bu değişkenler içine değerlerin URL üzerinden GET ile geleceğini gösterir. OnGetAsync() metodunda eğer bu değişkenlere veri gelirse mevcut bir movies listesinde movies = movies.Where(s => s.Title.Contains(SearchString)); ile güncelleme yapılır. Barada Where bir LINQ ifadesidir ve Title değerini içerenleri döndürür. Contains kelimesi aslında like sorgusu gibi davranır. Aynı şekilde MovieGenre değeri var ise bu sefer Contains yerine “==” kullanılır. “x => x.Genre == MovieGenre” bu kullanımın sebebi aranan değere tam eşit olması gerektiğini belirtir. Yukarıdaki kodlarla arama bölümü de hazır.