Doğrulama bir form içindeki değerleri uygun olup olmadığını kontrol etmek için kullanılır. Örneğin, e-mail olması gereken bir değer e-maile uygun mu, sayı olması gereken bir değer sayı içeriyor mu vb. kontroller doğrulama işlemine girer. Klasik bir web programlama yönteminde istemci tarafında bir kontrol işlemi yapılırken sunucu tarafında da yapılabilir. İstemci tarafında tarayıcı üzerinde Javascript kodları ile yapılan kontrol uygun şartlar sağlanmadan POST işlemini başlatmaz. Ancak, istemci bölümü her zaman aldatılabilecek olduğunu unutmayın. Bu yüzden sunucu tarafında doğrulama kontrolünde yarar vardır. Öğrencilerime her zaman iki tarafa da kontrol yapmalarını öneririm. Ancak iki taraf içinde benzer kodlar yazmak zaman alıcı bir süreçtir. Bu bölümde çift taraflı kontrole destek veren Microsoft’un yapısını inceleyeceğiz.
01.05.01. DRY ilkesi
Yazılım geliştirmenin temel ilkelerinden biri, DRY (“Don’t Repeat Yourself”) olarak adlandırılır. Razor Pages, bu felsefeye göre tasarlanmıştır. DRY felsefesi sayesinde:
- Bir uygulamadaki kod miktarı azaltılır
- Kod daha az hataya eğilimli hale gelmiş olur. Test edilmesi ve bakımı kolaylaşır.
Razor Pages ve Entity Framework sayesinde sağlanan doğrulama desteği, DRY felsefesine iyi bir örnektir. Doğrulama kuralları model için çok basit attribute’ler tanımlanarak yapılır. Tanımlar hem istemci hem de sunucu tarafını etkiler.
Uygulama:
Models/Movie.cs dosyasını açın. DataAnnotations, bir sınıf veya özellik için bildirimsel olarak uygulanan bir dizi doğrulama attribute’i sağlar. DataAnnotations ayrıca, biçimlendirmeye yardımcı olan ve doğrulama sağlamayan DataType gibi biçimlendirme attribute’lerini de içerir. Required, StringLength, RegularExpression ve Range attribute’lerini açtığımız dosyaya 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 |
public class Movie { public int ID { get; set; } [StringLength(60, MinimumLength = 3)] [Required] public string Title { get; set; } [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } [Range(1, 100)] [DataType(DataType.Currency)] [Column(TypeName = "decimal(18, 2)")] public decimal Price { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z""'\s-]*$")] [Required] [StringLength(30)] public string Genre { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")] [StringLength(5)] [Required] public string Rating { get; set; } } |
Doğrulama özellikleri, model özelliklerinde zorlanan davranışları belirtir:
- [Required] bu değerin gerekli olduğunu gösterir.
- [StringLength(60, MinimumLength = 3)] attribue değeri, string değerin maximum 60 karakterden oluştuğunu ve minimum 3 karakterden oluştuğu gösterir.
- [RegularExpression], patterne göre değerin valid olmadığını belirler.
- [Range] attribute, bir değeri belirlenen aralığa sığdırır.
ASP.NET Core tarafından otomatik olarak uygulanan doğrulama kurallarına sahip olmak, bir uygulamayı daha sağlam hale getirmeye yardımcı olur. Modellerdeki otomatik doğrulama, uygulamanın kolay şekilde geliştirilmesine yardımcı olur, çünkü yeni kod eklendiğinde istemci ve sunucu tarafını düşünmenizi gerektirmez.
01.05.02. Doğrulama işlemi
İlk doğrulama işlemi istemci tarafında tarayıcı üzerinde yapılır. JQuery istemci taraflı doğrulaması bir hata tespit ettiğinde, hata mesajını uygun etiket içinde gösterir. Eğer kullanıcı Javascript’i devre dışı bırakırsa JQuery kodları çalışmaz. Yalnız Doğrulama işlemi sadece istemci tarafında değil hem de sunucu tarafı yapılır. Bu sayede çift taraflı bir doğrulama yapılmış olur. Hem Create hem de Edit bölümlerinde ekstra bir işlem yapmadan doğrulama sağlanmış olur. DataAnnotations sadece modele uygulanır ve tüm doğrulama işlemleri aktive olmuş olur. Sunucu tarafında OnPostAsync metoduna yazılan aşağıdaki kontrol yeterlidir.
1 2 3 4 |
if (!ModelState.IsValid) { return Page(); } |
01.05.03. Datatype
Model bölümde diğer bir attribute Datatype kontrolüdür. Bu attribute doğrulama için değil, istemci tarafında verinin alınma şeklini belirler. Örneğin [DataType(DataType.Date)] attribute değeri tarayıcı tarafında gün seçimini aktive eder. [Column(TypeName = “decimal(18, 2)”)] attirbute ise tam sayı kısmının 18 ondalık sayının iki rakamdan oluşacağını belirler.
01.05.04. Display
[Display(Name = “Release Date”)] attribute cshtml dosyasında @Html.DisplayNameFor bölümde çağrıldığında gözüken name değerini belirlemek için kullanılır. Bu bölümde konuyu daha iyi anlamak için ufak değişiklikler yapın ve Razor sayfalarında oluşan değişiklikleri inceleyin.