SelamünAleyküm, bu yazıda Validation konusunun ilk yazısı ile Validation Nedir ve Custom Validation konularını ele alacağız.
Validation ( onaylama ), herhangi bir modeli doldurur iken modelin içindeki alanlara belirli şartları doğrulatma işlemi diyelbiliriz. Gelen verinin uzunluğu, gerekliliği, güvenliği gibi doğrulama işlemleri Validation kavramının içini kapsar.
Validation sayesinde girilen değerin "telefon numarası mı, e-posta adresi mi, parolası eşleşiyor mu/ güvenli mi, girilen numara banka kartına mı ait?" vb. işlemeri yaptırabiliriz. Bu şekilde özellikle kullanıcıdan aldığımız bilgilerı projemize daha sağlıklı alabiliriz. Bu şekilde projemizdeki olası aksaklıkları en baştan önlememizi sağlar.
Misalen client'tan e-posta adresini istiyoruz ve client e-posta adresine fıtratına uygun olmayan şekilde giriyor. Ardından projemiz içinden client'a bilgilendirme yapmak üzere e-posta gönderiyoruz. Fakat bize gönderilen e-posta adresi yanlış olduğundan, client'a e-posta ile bilgilendirme yapamıyoruz. Eğer baştan e-posta adresini fıtratına uygun mu diye kontrol etsek yani doğrulama yapsaydık bu tür bir sorunla karşılaşmayacaktık.
Misalen, Person isimli bir modelimiz olsun. Bu model içinde Validation'ları Attribute olarak tanımlayalım.
public class Person
{
[Required]
public int Id { get; set; }
[Required]
[MinLength(2, ErrorMessage = "Adınız en az iki karakter olmalıdır!")]
[MaxLength(50, ErrorMessage = "Adınız en fazla 50 karakter olmalıdır!")]
public string FirstName { get; set; }
[Required]
[MinLength(2, ErrorMessage = "Soyadınız en az iki karakter olmalıdır!")]
[MaxLength(50, ErrorMessage = "Soyadınız en fazla 50 karakter olmalıdır!")]
public string LastName { get; set; }
[StringLength(100, ErrorMessage = "Mesleğiniz 100 karakterden fazla olmamalı!")]
[Display(Name = "Meslek")]
public string Job { get; set; }
[Display(Name = "Parola")]
public string Password { get; set; }
[Compare("Password", ErrorMessage = "Parolalar uyuşmuyor!")]
[Display(Name = "Parola Tekrarı")]
public string RePassword { get; set; }
[EmailAddress(ErrorMessage = "Geçerli bir e-posta giriniz!")]
[Display(Name = "E-Posta Adresi")]
public string MailAddress { get; set; }
[Phone(ErrorMessage = "Geçerli bir telefon numarası giriniz!")]
[Display(Name = "Telefon Numarası")]
public string Phone { get; set; }
[Range(1, 81, ErrorMessage = "Bulunduğunuz şehrin plaka numarasını giriniz!")]
[Display(Name = "Şehir Id")]
public int CityId { get; set; }
[Url(ErrorMessage = "Varsa web adresinizi giriniz.")]
[Display(Name = "Web Adresi")]
public string WebAddress { get; set; }
Modelimizde görüldüğü üzere Url, Range, Phone, EmailAddress vb. şeklide doğrulamalar atadık. Şimdi ise bu doğrulamaları sınamak için bir form ekranı oluşturalım ve ilk olarak doğrulamaları bile isteye yanlış veriler lie dolduralım.
Misalen, PersonController adında bir Controller'imiz olsun. Bu Controller'e ait Create ve Index Action metotları olsun. Action metotlarının View'lerini oluşturalım. Create View'inde Validation'larımı kullanacağımız form bulunsun, Index View'inde ise girilen verileri ekranda gösterecek sade bir tablo olşuturalım.
public class PersonController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Create()
{
return View();
}
[HttpPost]
public IActionResult Create(Person person)
{
if (!ModelState.IsValid)
{
return View(person);
}
return RedirectToAction("Index", person);
}
}
Create Action metodunda görüleceği üzere ModelState.IsValid ile gelen dataları bizim Validation'larımıza uyacak mı diye kontrol edelim.
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model ValidotinExample_1.Models.Person
@{
Layout = null;
}
<link href="~/lib/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" />
<form method="post">
<div class="text-danger" asp-validation-summary="ModelOnly"></div>
<div class="form-group">
<label asp-for="Id"></label>
<input asp-for="Id" class="form-control" />
<span asp-validation-for="Id"></span>
</div>
<div class="form-group">
<label asp-for="FirstName"></label>
<input asp-for="FirstName" class="form-control" />
<span asp-validation-for="FirstName"></span>
</div>
<div class="form-group">
<label asp-for="LastName"></label>
<input asp-for="LastName" class="form-control" />
<span asp-validation-for="LastName"></span>
</div>
<div class="form-group">
<label asp-for="Job"></label>
<input asp-for="Job" class="form-control" />
<span asp-validation-for="Job"></span>
</div>
<div class="form-group">
<label asp-for="Password"></label>
<input asp-for="Password" class="form-control" />
<span asp-validation-for="Password"></span>
</div>
<div class="form-group">
<label asp-for="RePassword"></label>
<input asp-for="RePassword" class="form-control" />
<span asp-validation-for="RePassword"></span>
</div>
<div class="form-group">
<label asp-for="MailAddress"></label>
<input asp-for="MailAddress" class="form-control" />
<span asp-validation-for="MailAddress"></span>
</div>
<div class="form-group">
<label asp-for="Phone"></label>
<input asp-for="Phone" class="form-control" />
<span asp-validation-for="Phone"></span>
</div>
<div class="form-group">
<label asp-for="CityId"></label>
<input asp-for="CityId" class="form-control" />
<span asp-validation-for="CityId"></span>
</div>
<div class="form-group">
<label asp-for="WebAddress"></label>
<input asp-for="WebAddress" class="form-control" />
<span asp-validation-for="WebAddress"></span>
</div>
<input type="submit" value="Gönder" class="btn btn-success btn-sm" />
</form>
Not: | Creta View'ini az da olsa düzgün görünebilmesi için bootstrap kütüphanesi eklenmiştir. Ekleyip eklememek size kalmıştır. |
@model ValidotinExample_1.Models.Person
@{
ViewData["Title"] = "Index";
}
<table>
<tr>
<td>ID: </td>
<td>@Model.Id</td>
</tr>
<tr>
<td>Adı: </td>
<td>@Model.FirstName</td>
</tr>
<tr>
<td>Soyadı: </td>
<td>@Model.LastName</td>
</tr>
<tr>
<td>Meslek: </td>
<td>@Model.Job</td>
</tr>
<tr>
<td>ID: </td>
<td>@Model.Id</td>
</tr>
<tr>
<td>ID: </td>
<td>@Model.Id</td>
</tr>
<tr>
<td>E-Posta Adresi: </td>
<td>@Model.MailAddress</td>
</tr>
<tr>
<td>Plaka No: </td>
<td>@Model.CityId</td>
</tr>
<tr>
<td>Telefon No: </td>
<td>@Model.Phone</td>
</tr>
<tr>
<td>Web Adresi: </td>
<td>@Model.WebAddress</td>
</tr>
</table>
Ekranda görüleceği üzere forma girdiğimiz datalar Validation yapılanmasından geçemedi ve ekrandaki uyarılarla karşılaştık.
Tanımlanmamış bir doğrulama işlemimiz olduğunda bu doğrulama işlemimiz için Custom Validation oluşturabiliriz. Hangi alanda doğrulama yapmak istiyorsak o alana Attribute olarak size özel Validation'ı ekleyebiliriz.
Misalen, kimlik numarası ve şikâyet metnini alıp bu şikâyeti tarayıcı ekranında gösterelim. Şikâyet metninde, kullanıcıların uzun uzun metinler yazmasını kısıtlamak için metindeki kelime sayısı için bir validation işlemi yapalım. Bunun için Custom olarak bir Validation oluşturalım.
WordCountValidationAttribute adında bir class'ımız olsun ve bu Validation'da Attribute eklediğimiz alanı .Split(" ").Count kodu ile kelime sayısını hesaplatalım. Kelime sayısı Attribute'de verilen değerden büyükse geriye hata mesajı dönsün.
public class WordCountValidationAttribute : Attribute, IModelValidator
{
public string ErrorMessage { get; set; }
public int MaxWordCount { get; set; }
public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
{
var content = context.Model as String;
//kısıtla
if(String.IsNullOrEmpty(content) || content.Split(" ").Count() > MaxWordCount)
{
return new List<ModelValidationResult>
{
new ModelValidationResult("", ErrorMessage)
};
}
//izin ver
else
{
return Enumerable.Empty<ModelValidationResult>();
}
}
}
Custom Validation'ı oluşturduktan sonra formdan alacağımız şikâyet metni için bir model oluşturalım ve modelde şikâyet metnine oluşturduğumuz Validation'ı ekleyelim. Girilebilecek en fazla kelime sayısı da 25 kelime olsun.
public class Complaint
{
[Display(Name = "Kimlik No")]
public int Id { get; set; }
[WordCountValidation(ErrorMessage = "Şikayetiniz ne fazla 250 kelime olabilir.", MaxWordCount = 250)]
[Display(Name = "Şikayet Metni")]
public string ComplaintText { get; set; }
}
Create ve Index action metotlarımızın olduğu ComplaintController'imizi oluşturalım.
public class ComplaintController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Create()
{
return View();
}
[HttpPost]
public IActionResult Create(Complaint complaint)
{
if(!ModelState.IsValid)
{
return View(complaint);
}
return RedirectToAction("Index", "Complaint", complaint);
}
}
Create View'imizi oluşturalım ve burada kullanıcıdan ilgili dataları almak için bir form oluşturalım.
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model ValidotinExample_1.Models.Complaint
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Create</title>
<link href="~/lib/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<form method="post">
<div class="text-danger" asp-validation-summary="ModelOnly"></div>
<div class="form-group">
<label asp-for="Id"></label>
<input asp-for="Id" class="form-control" />
<span asp-validation-for="Id"></span>
</div>
<div class="form-group">
<label asp-for="ComplaintText"></label>
<input asp-for="ComplaintText" class="form-control" />
<span asp-validation-for="ComplaintText"></span>
</div>
<button type="submit" class="btn btn-info btn-sm"> Gönder </button>
</form>
</body>
</html>
Son olarak alacağımız şikâyeti ekranda göstermek için Index View'imizi oluşturalım.
@model ValidotinExample_1.Models.Complaint
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<table>
<tr>
<td>Kimlik No: </td>
<td>@Model.Id </td>
</tr>
<tr>
<td>Şikayet Metni: </td>
<td>@Model.ComplaintText </td>
</tr>
</table>
</body>
</html>
Projemizi çalıştıralım ve formumuzun olduğu sayfada şikâyet metimizi 25 kelimden fazla girelim.
Bu yazımızın sonuna geldik. Bu yazıda Validation konusunun ilk yazısı ile Validation nedir ve Custom Validation konusunu ele almış olduk. İlgili projenin github adresine buradan ulaşabilirsiniz. İlgilenenlerin faydalanması ümidiyle.
Asp .Net Core SignalR 6 - SignalR'da IHubContext Kullanımı
Devamı OkuYazılım, teknoloji ve daha fazlası için bizi takip edin.
© Techno Guide. Tüm Hakları Saklıdır.
HTML Codex Tasarımıdır.