Core Mvc uygulamalarında projeleri gruplandırarak basitleştirme işlemleri için Area yapısını kullanabilirsiniz. Her bir sayfa linki için sayfaya özel Route ayarı yapabilirsiniz. Bu uygulamada girilen bir hicri ay adını görüntüleyen programı Area ve Route tanımlayarak yapacağız.
1. Area Oluşturma
İlk olarak Areas/HicriAylar adında bir Area oluşturuyoruz. Bu Area içinde aşağıdaki klasörler bulunmalı:
Areas
├── HicriAylar
│ ├── Controllers
│ ├── Models
│ ├── Views
Bu yapı, MVC mimarisini koruyarak projemizi modüler hale getirir.
2. Area Kaydı ve Ayarları
Area’ların çalışabilmesi için Program.cs dosyasında endpoint ayarlarını yapmamız gerekiyor:
Program.cs içinde Area desteği ekleyin.
app.MapControllerRoute(
name: "areas",
pattern: "{area:exists}/{controller=HicriAy}/{action=Index}/{id?}"
);
Bu yapı, URL'nin "area/controller/action" şeklinde çalışmasını sağlar.
Örnek URL: https://localhost:5001/HicriAylar/HicriAylar/Ekle
3. Model Oluşturma
Kullanıcının girdiği Hicri ay adının doğruluğunu kontrol etmek için bir model oluşturacağız.
Ay adı boş geçilemez.
Ay adı en fazla 50 karakter olabilir.
Areas/HicriAylar/Models/HicriAyModel.cs
using System.ComponentModel.DataAnnotations;
namespace HicriAylarUygulamasi.Areas.HicriAylar.Models
{
public class HicriAyModel
{
[Required(ErrorMessage = "Hicri ay adı zorunludur.")]
[MaxLength(50, ErrorMessage = "Hicri ay adı en fazla 50 karakter olabilir.")]
public string HicriAyAdi { get; set; }
}
}
Açıklamalar:
[Required] → Kullanıcının boş giriş yapmasını engeller.
[MaxLength(50)] → Hicri ay adının en fazla 50 karakter olmasını sağlar.
4. Controller Tanımlama
Kullanıcıdan gelen Hicri ay bilgisini alıp listeye ekleyen ve görüntüleyen bir controller oluşturacağız.
Areas/HicriAylar/Controllers/HicriAylarController.cs
using Microsoft.AspNetCore.Mvc;
using HicriAylarUygulamasi.Areas.HicriAylar.Models;
using System.Collections.Generic;
namespace HicriAylarUygulamasi.Areas.HicriAylar.Controllers
{
[Area("HicriAylar")]
[Route("HicriAylar/[controller]/[action]")]
public class HicriAylarController : Controller
{
private static List<string> HicriAyListesi = new List<string>();
[HttpGet]
public IActionResult Index()
{
return View(HicriAyListesi);
}
[HttpPost]
public IActionResult Ekle(HicriAyModel model)
{
if (ModelState.IsValid)
{
HicriAyListesi.Add(model.HicriAyAdi);
}
return RedirectToAction("Index");
}
}
}
Açıklamalar:
[Area("HicriAylar")] → Bu controller'in "HicriAylar" alanına ait olduğunu belirtir.
[Route("HicriAylar/[controller]/[action]")] → Route tanımı dinamik hale getirilmiştir.
static List<string> HicriAyListesi → Girilen Hicri ay adlarını hafızada saklamak için kullanılır.
Index() → Girilen Hicri ay adlarını görüntüler.
Ekle(HicriAyModel model) → Kullanıcıdan gelen veriyi Model Binding ile alır ve listeye ekler.
Örnek URL: /HicriAylar/HicriAylar/Ekle
5. View Tasarımı
Kullanıcı girilen Hicri ay adlarını görebilecek ve yeni ay adı ekleyebilecek.
Areas/HicriAylar/Views/HicriAylar/Index.cshtml
@model List<string>
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<h1>Hicri Ay Listesi</h1>
<ul>
@foreach (var ay in Model)
{
<li>@ay</li>
}
</ul>
<form method="post" action="/HicriAylar/HicriAylar/Ekle">
<label for="hicriAyAdi">Yeni Hicri Ay Adı:</label>
<input type="text" id="hicriAyAdi" name="HicriAyAdi" required maxlength="50" />
<button type="submit">Ekle</button>
</form>
@if (!ViewData.ModelState.IsValid)
{
<ul>
@foreach (var error in ViewData.ModelState["HicriAyAdi"].Errors)
{
<li style="color: red;">@error.ErrorMessage</li>
}
</ul>
}
6. Çalıştırma ve Test
Uygulamayı başlatın ve tarayıcıda şu URL'yi ziyaret edin:
https://localhost:5001/HicriAylar/HicriAylar/Index
Bir Hicri ay adı girin ve ekleyin. Listeye eklendiğini göreceksiniz.
Hatalı girişleri test edin:
Boş geçmeyin! "Hicri ay adı zorunludur." hatası alırsınız.
50 karakterden uzun bir şey girin! "Hicri ay adı en fazla 50 karakter olabilir." hatası alırsınız.