Edit işlemi için öncelikle güncellenecek kaydım benzersiz değerine (PK, birincil anahtar) ihtiyaç vardır. Öncelikle verinin verinin araması yapılır ve uygun kayıt döndürülür. Buradan dönen değerler form etiketi içinde istemci tarafına aktarılır. Daha sonra form üzerinde değişiklikler yapılır ve sunucuya POST edilir. Sunucu tarafında veritabanında bir update işlemi yapılır. Senaryoyu belirledikten sonra gelelim kod bölümünü yorumlamaya:
Öncelikle Edit.cshtml.cs dosyasına bakalım.
Edit.cshtml.cs
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
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 EditModel : PageModel { private readonly RazorPagesMovie.Models.RazorPagesMovieContext _context; public EditModel(RazorPagesMovie.Models.RazorPagesMovieContext context) { _context = context; } [BindProperty] public Movie Movie { get; set; } public async Task<IActionResult> OnGetAsync(int? id) { if (id == null) { return NotFound(); } Movie = await _context.Movie.FirstOrDefaultAsync(m => m.ID == id); if (Movie == null) { return NotFound(); } return Page(); } public async Task<IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return Page(); } _context.Attach(Movie).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!MovieExists(Movie.ID)) { return NotFound(); } else { throw; } } return RedirectToPage("./Index"); } private bool MovieExists(int id) { return _context.Movie.Any(e => e.ID == id); } } } |
OnGetAsync(int? id) işlemi URL üzerinde gelen “id” değerini alır ve FirstOrDefaultAsync(m => m.ID == id) arama yapar. Eğer arama sonucu olumlu ise bir Movie nesnesi döndürülür. Daha sonra Page() metodu çağrılarak veritabanından alınan değerler HTML sayfa üzerine eklenir ve istemciye gönderilir.
OnPostAsync() işlemi yapıldığında [BindProperty] sayesinde istemci tarafından gönderilen değerler Movie nesnesine aktarılır. Eğer form valid ise işlemin bir güncelleme olduğu _context.Attach(Movie).State = EntityState.Modified; ile context’e bildirilir. Daha sonra await _context.SaveChangesAsync() metodu ile UPDATE işlemi yapılmış olur. Burada bu işlemde sorun çıkması dikkate alınıp try-catch ifadesi kullanılmıştır. Burada MovieExists() fonksiyonu ile kaydın var olup olmadığı kontrol edilir.
Burada Edit.cshtml kodu Create.cshtml kodunun çok benzeridir.