Sinif modelini ve ilişkili olan Alan, Dal ve Grup tabloları ile birlikte oluşturulacak controller ve görünümleri de aşağıda detaylı bir şekilde paylaşacağım. Bu yapıyı, model, controller ve ilgili sayfalarla oluşturacağız.
Öncelikle, Sinif modelinizi şu şekilde oluşturuyoruz:
namespace SchoolManagement.Models
{
public class Sinif
{
public int Id { get; set; }
public string SinifAdi { get; set; }
public int? AlanId { get; set; }
public Alan? Alan { get; set; }
public int? DalId { get; set; }
public Dal? Dal { get; set; }
public int? GrupId { get; set; }
public Grup? Grup { get; set; }
}
}
Burada, Sinif modeli, Alan, Dal ve Grup ile ilişkili. Bu ilişkiler Foreign Key kullanarak sağlanıyor. İlişkiye dikkat ediniz, alanların boş girilmesi yeterli oluyor.
Sinif için CRUD işlemleri yapmak üzere bir controller oluşturuyoruz. Bu controller'da, Alan, Dal ve Grup verileri ile ilgili dropdown menülerini eklemek de dahil olacak.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using SchoolManagement.Data;
using SchoolManagement.Models;
namespace SchoolManagement.Controllers.Admin
{
[Authorize(Roles = "Admin")]
public class SinifController : Controller
{
private readonly ApplicationDbContext _context;
public SinifController(ApplicationDbContext context)
{
_context = context;
}
// 1. Sınıf Listeleme
public async Task<IActionResult> Index()
{
var siniflar = await _context.Siniflar
.Include(s => s.Alan)
.Include(s => s.Dal)
.Include(s => s.Grup)
.ToListAsync();
return View("~/Views/Admin/Sinif/Index.cshtml", siniflar);
}
// 2. Yeni Sınıf Ekleme (GET)
public IActionResult Create()
{
ViewBag.Alan = new SelectList(_context.Alanlar, "Id", "AlanAdi");
ViewBag.Dal = new SelectList(_context.Dallar, "Id", "DalAdi");
ViewBag.Grup = new SelectList(_context.Gruplar, "Id", "GrupAdi");
return View("~/Views/Admin/Sinif/Create.cshtml");
}
// 3. Yeni Sınıf Ekleme (POST)
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Sinif sinif)
{
if (sinif.AlanId == null && sinif.DalId == null && sinif.GrupId == null)
{
ModelState.AddModelError("", "En az bir kategori seçilmelidir.");
}
if (ModelState.IsValid)
{
_context.Add(sinif);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
ViewBag.Alan = new SelectList(_context.Alanlar, "Id", "AlanAdi", sinif.AlanId);
ViewBag.Dal = new SelectList(_context.Dallar, "Id", "DalAdi", sinif.DalId);
ViewBag.Grup = new SelectList(_context.Gruplar, "Id", "GrupAdi", sinif.GrupId);
return View("~/Views/Admin/Sinif/Create.cshtml", sinif);
}
// 4. Sınıf Düzenleme (GET)
public async Task<IActionResult> Edit(int id)
{
var sinif = await _context.Siniflar
.Include(s => s.Alan) // Alan ilişkisini dahil et
.Include(s => s.Dal) // Dal ilişkisini dahil et
.Include(s => s.Grup) // Grup ilişkisini dahil et
.FirstOrDefaultAsync(s => s.Id == id); // Sınıfı id'ye göre bul
if (sinif == null)
{
return NotFound(); // Eğer sınıf bulunmazsa, 404 hatası döndür
}
// ViewBag ile ilişkili verileri View'a gönderiyoruz
ViewBag.Alan = new SelectList(_context.Alanlar, "Id", "AlanAdi", sinif.AlanId);
ViewBag.Dal = new SelectList(_context.Dallar, "Id", "DalAdi", sinif.DalId);
ViewBag.Grup = new SelectList(_context.Gruplar, "Id", "GrupAdi", sinif.GrupId);
return View("~/Views/Admin/Sinif/Edit.cshtml", sinif); // Düzenleme sayfasına yönlendir
}
// 5. Sınıf Düzenleme (POST)
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, Sinif sinif)
{
if (id != sinif.Id) // Eğer ID'ler eşleşmezse, hata döndür
{
return NotFound();
}
if (ModelState.IsValid) // Model geçerliyse
{
try
{
_context.Update(sinif); // Sınıfı güncelle
await _context.SaveChangesAsync(); // Değişiklikleri kaydet
}
catch (DbUpdateConcurrencyException) // Hata yakalanırsa
{
if (!SinifExists(sinif.Id)) // Eğer sınıf yoksa, 404 hatası döndür
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index)); // Düzenleme işleminden sonra listeye dön
}
// Eğer model geçerli değilse, ViewBag ile ilişkili verileri tekrar gönder
ViewBag.Alan = new SelectList(_context.Alanlar, "Id", "AlanAdi", sinif.AlanId);
ViewBag.Dal = new SelectList(_context.Dallar, "Id", "DalAdi", sinif.DalId);
ViewBag.Grup = new SelectList(_context.Gruplar, "Id", "GrupAdi", sinif.GrupId);
return View("~/Views/Admin/Sinif/Edit.cshtml", sinif); // Formu tekrar göster
}
// 6. Sınıf Silme (GET)
public async Task<IActionResult> Delete(int id)
{
var sinif = await _context.Siniflar
.Include(s => s.Alan)
.Include(s => s.Dal)
.Include(s => s.Grup)
.FirstOrDefaultAsync(m => m.Id == id);
if (sinif == null)
{
return NotFound();
}
return View("~/Views/Admin/Sinif/Delete.cshtml", sinif);
}
// 7. Sınıf Silme (POST)
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var sinif = await _context.Siniflar.FindAsync(id);
if (sinif != null)
{
_context.Siniflar.Remove(sinif);
await _context.SaveChangesAsync();
}
return RedirectToAction(nameof(Index));
}
// Sınıfın var olup olmadığını kontrol eden metod
private bool SinifExists(int id)
{
return _context.Siniflar.Any(e => e.Id == id);
}
}
}
Sinifları listelemek için kullanılan sayfa:
@model IEnumerable<SchoolManagement.Models.Sinif>
@{
ViewData["Title"] = "Sınıflar";
}
<h2>Sınıf Listesi</h2>
<p>
<a class="btn btn-primary" asp-action="Create">Yeni Sınıf Ekle</a>
</p>
<table class="table table-bordered mt-3">
<thead>
<tr>
<th>ID</th>
<th>Sınıf Adı</th>
<th>Alan</th>
<th>Dal</th>
<th>Grup</th>
<th>İşlemler</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.Id</td>
<td>@item.SinifAdi</td>
<td>@item.Alan?.AlanAdi</td> <!-- AlanId'yi viewbag üzerinden alıp işlem yapılacaksa viewbag üzerinden render edilmesi -->
<td>@item.Dal?.DalAdi</td>
<td>@item.Grup?.GrupAdi</td>
<td>
<a class="btn btn-warning btn-sm" asp-action="Edit" asp-route-id="@item.Id">Düzenle</a>
<a class="btn btn-danger btn-sm" asp-action="Delete" asp-route-id="@item.Id">Sil</a>
</td>
</tr>
}
</tbody>
</table>
Yeni Sınıf Ekleme Sayfası (Create.cshtml)
Yeni bir sınıf eklemek için kullanılan sayfa:
@model SchoolManagement.Models.Sinif
@{
ViewData["Title"] = "Yeni Sınıf Ekle";
}
<h2>Yeni Sınıf Ekle</h2>
<!-- Validation summary - Tüm form hatalarını buraya toplar -->
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<form asp-action="Create" method="post">
<!-- SinifAdi: Sınıf Adı için giriş -->
<div class="form-group">
<label asp-for="SinifAdi"></label>
<input asp-for="SinifAdi" class="form-control" required />
@Html.ValidationMessageFor(model => model.SinifAdi, "", new { @class = "text-danger" }) <!-- SinifAdi için hata mesajı -->
</div>
<!-- AlanId: Alan seçimi -->
<div class="form-group">
<label asp-for="AlanId"></label>
<select asp-for="AlanId" class="form-control" asp-items="@(ViewBag.Alan as SelectList)">
<option value="">Seçiniz</option> <!-- Opsiyonel boş seçenek -->
</select>
@Html.ValidationMessageFor(model => model.AlanId, "", new { @class = "text-danger" }) <!-- AlanId için hata mesajı -->
</div>
<!-- DalId: Dal seçimi -->
<div class="form-group">
<label asp-for="DalId"></label>
<select asp-for="DalId" class="form-control" asp-items="@(ViewBag.Dal as SelectList)">
<option value="">Seçiniz</option> <!-- Opsiyonel boş seçenek -->
</select>
@Html.ValidationMessageFor(model => model.DalId, "", new { @class = "text-danger" }) <!-- DalId için hata mesajı -->
</div>
<!-- GrupId: Grup seçimi -->
<div class="form-group">
<label asp-for="GrupId"></label>
<select asp-for="GrupId" class="form-control" asp-items="@(ViewBag.Grup as SelectList)">
<option value="">Seçiniz</option> <!-- Opsiyonel boş seçenek -->
</select>
@Html.ValidationMessageFor(model => model.GrupId, "", new { @class = "text-danger" }) <!-- GrupId için hata mesajı -->
</div>
<!-- Submit butonu -->
<button type="submit" class="btn btn-success mt-2">Kaydet</button>
</form>
<p>
<!-- Geri dönme linki -->
<a asp-action="Index">Geri Dön</a>
</p>
Var olan bir sınıfı düzenlemek için kullanılan sayfa:
@model SchoolManagement.Models.Sinif
@{
ViewData["Title"] = "Sınıf Düzenle";
}
<h2>Sınıf Düzenle</h2>
<!-- Validation summary - Tüm form hatalarını buraya toplar -->
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<form asp-action="Edit" method="post">
<!-- SinifAdi: Sınıf Adı için giriş -->
<div class="form-group">
<label asp-for="SinifAdi"></label>
<input asp-for="SinifAdi" class="form-control" required />
@Html.ValidationMessageFor(model => model.SinifAdi, "", new { @class = "text-danger" }) <!-- SinifAdi için hata mesajı -->
</div>
<!-- Alan: Alan seçimi -->
<div class="form-group">
<label for="AlanId">Alan</label> <!-- AlanId yerine Alan başlığını kullandık -->
<select asp-for="AlanId" class="form-control" asp-items="@(ViewBag.Alan as SelectList)">
<option value="">Seçiniz</option> <!-- Opsiyonel boş seçenek -->
</select>
@Html.ValidationMessageFor(model => model.AlanId, "", new { @class = "text-danger" }) <!-- AlanId için hata mesajı -->
</div>
<!-- Dal: Dal seçimi -->
<div class="form-group">
<label for="DalId">Dal</label> <!-- DalId yerine Dal başlığını kullandık -->
<select asp-for="DalId" class="form-control" asp-items="@(ViewBag.Dal as SelectList)">
<option value="">Seçiniz</option> <!-- Opsiyonel boş seçenek -->
</select>
@Html.ValidationMessageFor(model => model.DalId, "", new { @class = "text-danger" }) <!-- DalId için hata mesajı -->
</div>
<!-- Grup: Grup seçimi -->
<div class="form-group">
<label for="GrupId">Grup</label> <!-- GrupId yerine Grup başlığını kullandık -->
<select asp-for="GrupId" class="form-control" asp-items="@(ViewBag.Grup as SelectList)">
<option value="">Seçiniz</option> <!-- Opsiyonel boş seçenek -->
</select>
@Html.ValidationMessageFor(model => model.GrupId, "", new { @class = "text-danger" }) <!-- GrupId için hata mesajı -->
</div>
<!-- Submit butonu -->
<button type="submit" class="btn btn-success mt-2">Kaydet</button>
</form>
<p>
<!-- Geri dönme linki -->
<a asp-action="Index">Geri Dön</a>
</p>
Sınıf Silme Sayfası (Delete.cshtml)
Bir sınıfı silmek için kullanılan sayfa:
@model SchoolManagement.Models.Sinif
@{
ViewData["Title"] = "Sınıf Sil";
}
<h2>Sınıf Sil</h2>
<p>@Model.SinifAdi adlı sınıfı silmek istediğinizden emin misiniz?</p>
<form asp-action="Delete" method="post">
<!-- Model'deki Id'yi gizli bir şekilde gönderiyoruz -->
<input type="hidden" asp-for="Id" />
<button type="submit" class="btn btn-danger">Sil</button>
</form>
<p>
<a asp-action="Index">Geri Dön</a>
</p>