Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not
Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.
Bu bölümde:
- Doğrulama mantığı modele
Movieeklenir. - Bir kullanıcı bir film oluşturduğunda veya düzenlediğinde doğrulama kurallarının zorunlu kılındığından emin olursunuz.
Öğeleri KURU TUTMA
MVC'nin tasarım tenetlerinden biri DRY 'dur ("Kendinizi Tekrar etmeyin"). ASP.NET Core MVC, işlevselliği veya davranışı yalnızca bir kez belirtmenizi ve ardından uygulamanın her yerine yansıtılmanızı sağlar. Bu, yazmanız gereken kod miktarını azaltır ve yaptığınız kodun daha az hataya açık olmasını, testini ve bakımının daha kolay olmasını sağlar.
MVC ve Entity Framework Core tarafından sağlanan doğrulama desteği, DRY ilkesinin nasıl çalıştığının iyi bir örneğidir. Doğrulama kurallarını bildirimli olarak tek bir yerde (model sınıfında) belirtebilirsiniz ve kurallar uygulamanın her yerinde uygulanır.
Daha önce düzenlenen verileri silme
Sonraki adımda, null değerlere izin vermeyecek doğrulama kuralları eklenir.
Uygulamayı çalıştırın, adresine /Movies/Indexgidin, listelenen tüm filmleri silin ve uygulamayı durdurun. Uygulama, bir sonraki çalıştırıldığında tohum verilerini kullanır.
Film modeline doğrulama kuralları ekleme
DataAnnotations ad alanı, bir sınıfa veya özelliğe bildirim temelli olarak uygulanan yerleşik doğrulama öznitelikleri kümesi sağlar. DataAnnotations biçimlendirmeye yardımcı olan ve hiçbir doğrulama sağlamayan DataType gibi biçimlendirme öznitelikleri de içerir.
Yerleşik doğrulama öznitelikleri Movie, Required, StringLength, RegularExpression ve Range biçimlendirme özniteliğinden yararlanmak için DataType sınıfını güncelleştirin.
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
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 öznitelikleri, uygulandıkları model özelliklerinde zorlamak istediğiniz davranışı belirtir:
RequiredveMinimumLengthöznitelikleri, bir özelliğin bir değere sahip olması gerektiğini belirtir, ancak hiçbir şey kullanıcının bu doğrulamayı karşılamak için boşluk girmesini engellemez.RegularExpressionözniteliği girilebilecek karakterleri sınırlamak için kullanılır. Önceki kodda "Genre":- Yalnızca harfleri kullanmalıdır.
- İlk harfin büyük harf olması gerekir. Boşluklara izin verilirken, sayılara ve özel karakterlere izin verilmez.
RegularExpression"Rating":- İlk karakterin büyük harf olmasını gerektirir.
- Sonraki alanlarda özel karakterlere ve sayılara izin verir. "PG-13" değeri derecelendirme için geçerlidir ama Tür için geçerli değildir.
Rangeözniteliği, bir değeri belirtilen bir aralık içinde kısıtlar.StringLengthözniteliği, bir dize özelliğinin uzunluk üst sınırını ve isteğe bağlı olarak en düşük uzunluğunu ayarlamanıza olanak tanır.Değer türleri (
decimal,int,float,DateTimegibi) doğal olarak gereklidir ve[Required]özniteliği gerekmez.
doğrulama kurallarının ASP.NET Core tarafından otomatik olarak uygulanması uygulamanızın daha güçlü olmasına yardımcı olur. Ayrıca, bir şeyi doğrulamayı unutamamanızı ve yanlışlıkla hatalı verilerin veritabanına girişine izin vermenizi sağlar.
Doğrulama Hatası Arayüzü
Uygulamayı çalıştırın ve Filmler denetleyicisine gidin.
Yeni bir film eklemek için Yeni Oluştur bağlantısını seçin. Formu bazı geçersiz değerlerle doldurun. jQuery istemci tarafı doğrulaması hatayı algılar algılamaz bir hata iletisi görüntüler.
Not
Ondalık alanlara ondalık virgül girmeniz mümkün olmayabilir. ABD İngilizcesi olmayan tarih biçimlerini ve ondalık ayırıcı olarak virgül (",") kullanan İngilizce dışındaki yerel ayarları desteklemek için jQuery doğrulamasını uygulamanızı küreselleştirme adımlarını atmanız gerekir. Ondalık virgül ekleme yönergeleri için GitHub yorumu 4076'ya bakın.
Formun her alanda geçersiz değer içeren uygun bir doğrulama hata iletisini otomatik olarak işlediğine dikkat edin. Hatalar hem istemci tarafında (JavaScript ve jQuery kullanılarak) hem de sunucu tarafında (kullanıcının JavaScript'i devre dışı bırakması durumunda) uygulanır.
Önemli bir avantaj, bu doğrulama kullanıcı arabirimini etkinleştirmek için MoviesController sınıfında veya Create.cshtml görünümünde tek bir kod satırını değiştirmeniz gerekmemesidir. Bu öğreticide daha önce oluşturduğunuz denetleyici ve görünümler, model sınıfının özelliklerinde Movie doğrulama özniteliklerini kullanarak belirttiğiniz doğrulama kurallarını otomatik olarak aldı. Test doğrulamasını Edit eylem metodunu kullanarak gerçekleştirin ve aynı doğrulama uygulanır.
İstemci tarafı doğrulama hataları olmadan form verileri sunucuya gönderilmez.
HTTP Post yöntemine bir durma noktası koyarak, Fiddler aracı veya F12 Geliştirici araçlarını kullanarak bunu doğrulayabilirsiniz.
Doğrulama nasıl çalışır?
Denetleyicideki veya görünümlerdeki kodda herhangi bir güncelleştirme olmadan doğrulama kullanıcı arabiriminin nasıl oluşturulduğunu merak edebilirsiniz. Aşağıdaki kod iki Create yöntemi gösterir.
// GET: Movies/Create
public IActionResult Create()
{
return View();
}
// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (ModelState.IsValid)
{
_context.Add(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(movie);
}
İlk (HTTP GET) Create eylem yöntemi ilk Oluşturma formunu görüntüler. İkinci ([HttpPost]) sürüm, form gönderisini işler. İkinci Create yöntem ( [HttpPost] Sürüm), filmin herhangi bir doğrulama hatası olup olmadığını denetlemek için çağırır ModelState.IsValid . Bu yöntemin çağrılması, nesneye uygulanmış olan tüm doğrulama özniteliklerini değerlendirir. Nesnede doğrulama hataları varsa, Create yöntemi formu yeniden görüntüler. Hata yoksa yöntemi yeni filmi veritabanına kaydeder. Film örneğimizde, istemci tarafında doğrulama hataları algılandığında form sunucuya gönderilmez; İstemci tarafı doğrulama hataları olduğunda ikinci Create yöntem hiçbir zaman çağrılmaz. Tarayıcınızda JavaScript'i devre dışı bırakırsanız istemci doğrulaması devre dışı bırakılır ve doğrulama hatalarını algılayan HTTP POST Create yöntemini ModelState.IsValid test edebilirsiniz.
yönteminde bir kesme noktası ayarlayabilir ve yöntemin [HttpPost] Create hiçbir zaman çağrılmadığını doğrulayabilirsiniz; doğrulama hataları algılandığında istemci tarafı doğrulaması form verilerini göndermez. Tarayıcınızın JavaScript'i devre dışı bırakırsanız ve oluşan hatalarla formu gönderirseniz, kesme noktası görülür. JavaScript olmadan da tam doğrulama elde edersiniz.
Aşağıdaki görüntüde, Chrome tarayıcısında JavaScript'in nasıl devre dışı bırakılası gösterilmektedir. Kullandığınız tarayıcıda JavaScript'in nasıl devre dışı bırakıldığını öğrenmek için ayarlarda arama yapın.
JavaScript'i devre dışı bırakdıktan sonra geçersiz veri gönderin ve hata ayıklayıcıda adım adım ilerleyin.
Görünüm şablonunun Create.cshtml bir bölümü aşağıdaki işaretlemede gösterilir:
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
@*Markup removed for brevity.*@
Önceki işaretleme, eylem yöntemleri tarafından ilk formu görüntülemek ve bir hata durumunda yeniden görüntülemek için kullanılır.
Giriş Etiketi Yardımcısı DataAnnotations özniteliklerini kullanır ve istemci tarafında jQuery Doğrulaması için gereken HTML özniteliklerini üretir. Doğrulama Etiketi Yardımcısı doğrulama hatalarını görüntüler. Daha fazla bilgi için bkz . Doğrulama .
Bu yaklaşımın hoş yanı, denetleyici veya görünüm şablonunun uygulanan gerçek doğrulama kuralları veya görüntülenen belirli hata iletileri hakkında hiçbir şey bilmemesidir. Doğrulama kuralları ve hata dizeleri yalnızca sınıfında Movie belirtilir. Bu aynı doğrulama kuralları, Edit görünümüne ve modelinizi düzenleyen başka herhangi bir görünüm şablonuna otomatik olarak uygulanır.
Doğrulama mantığını değiştirmeniz gerektiğinde, modele doğrulama öznitelikleri ekleyerek (bu örnekte Movie sınıfı) bunu tam olarak tek bir yerde yapabilirsiniz. Uygulamanın farklı bölümlerinin kuralların nasıl uygulandığıyla tutarsız olması konusunda endişelenmeniz gerekmez; tüm doğrulama mantığı tek bir yerde tanımlanır ve her yerde kullanılır. Bu, kodu çok temiz tutar ve bakımını ve gelişmesini kolaylaştırır. Bu da DRY prensibini tamamen uygulayacağınız anlamına geliyor.
DataType Özniteliklerini Kullanma
Movie.cs dosyasını açın ve Movie sınıfını inceleyin. Namespace, System.ComponentModel.DataAnnotations yerleşik doğrulama öznitelikleri kümesine ek olarak biçimlendirme öznitelikleri sağlar. Yayın tarihine ve fiyat alanlarına zaten bir DataType numaralandırma değeri uyguladık. Aşağıdaki kod, ReleaseDate ve Price özelliklerini uygun DataType özniteliği ile gösterir.
[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; }
DataType Öznitelikler yalnızca verileri biçimlendirmek için görünüm altyapısına ipuçları sağlar ve URL'ler ve <a> e-posta için gibi <a href="mailto:EmailAddress.com"> öğeler/öznitelikler sağlar. Veri biçimini doğrulamak için özniteliğini kullanabilirsiniz RegularExpression .
DataType özniteliği, veritabanı iç türünden daha özel bir veri türü belirtmek için kullanılır; bunlar doğrulama öznitelikleri değildir. Bu durumda yalnızca tarihi takip etmek istiyoruz, saati değil. Numaralandırma Tarih DataType , Saat, Telefon Numarası, Para Birimi, EmailAddress ve daha fazlası gibi birçok veri türünü sağlar. Özniteliği, DataType uygulamanın türe özgü özellikleri otomatik olarak sağlamasına da olanak sağlayabilir. Örneğin, bir mailto: bağlantısı oluşturulabilir ve HTML5'i destekleyen tarayıcılarda DataType.EmailAddress için bir tarih seçici sağlanabilir. Öznitelikler, DataType HTML 5 data- tarayıcılarının anlayabileceği HTML 5 (belirgin veri tiresi) öznitelikleri yayar.
DataType Öznitelikler herhangi bir doğrulama sağlamaz.
DataType.Date görüntülenen tarihin biçimini belirtmez. Varsayılan olarak, veri alanı sunucunun CultureInfoöğesine göre varsayılan biçimlere göre görüntülenir.
DisplayFormat özniteliği, tarih biçimini açıkça belirtmek için kullanılır:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
ayarı, ApplyFormatInEditMode değer düzenleme için bir metin kutusunda görüntülendiğinde biçimlendirmenin de uygulanması gerektiğini belirtir. (Bazı alanlarda bunu istemeyebilirsiniz; örneğin, para birimi değerleri için, büyük olasılıkla metin kutusunda para birimi simgesinin düzenlenmesini istemezsiniz.)
özniteliğini DisplayFormat tek başına kullanabilirsiniz, ancak özniteliğini DataType kullanmak genellikle iyi bir fikirdir.
DataType özniteliği, verilerin ekranda nasıl işleneceğinin aksine semantiğini iletir ve DisplayFormat ile elde etmediğiniz aşağıdaki avantajları sağlar:
Tarayıcı HTML5 özelliklerini etkinleştirebilir (örneğin, bir takvim denetimi, yerel ayara uygun para birimi simgesi, e-posta bağlantıları vb.)
Varsayılan olarak, tarayıcı yerel ayarınıza göre doğru biçimi kullanarak verileri işler.
DataTypeözniteliği, MVC'nin verileri işlemek için doğru alan şablonunu seçmesini sağlayabilir (DisplayFormatkendisi tarafından kullanılıyorsa, dize şablonunu kullanır).
Migrasyonları uygula
Bazı doğrulama öznitelikleri veritabanı şemasını etkiler. Örneğin, [Required] bir sütun NOT NULL oluşturur ve [StringLength(60)] sütun türünü ile nvarchar(60)sınırlar. Veritabanı şemasının modelle tutarlı olmasını sağlamak için bir geçiş çalıştırın.
Tools menüsünden NuGet Paket Yöneticisi > Paket Yöneticisi Console öğesini seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration New_DataAnnotations
Update-Database
İlgili içerik
Bu bölümde:
- Doğrulama mantığı modele
Movieeklenir. - Bir kullanıcı bir film oluşturduğunda veya düzenlediğinde doğrulama kurallarının zorunlu kılındığından emin olursunuz.
Öğeleri KURU TUTMA
MVC'nin tasarım tenetlerinden biri DRY 'dur ("Kendinizi Tekrar etmeyin"). ASP.NET Core MVC, işlevselliği veya davranışı yalnızca bir kez belirtmenizi ve ardından uygulamanın her yerine yansıtılmanızı sağlar. Bu, yazmanız gereken kod miktarını azaltır ve yaptığınız kodun daha az hataya açık olmasını, testini ve bakımının daha kolay olmasını sağlar.
MVC ve Entity Framework Core tarafından sağlanan doğrulama desteği, DRY ilkesinin nasıl çalıştığının iyi bir örneğidir. Doğrulama kurallarını bildirimli olarak tek bir yerde (model sınıfında) belirtebilirsiniz ve kurallar uygulamanın her yerinde uygulanır.
Daha önce düzenlenen verileri silme
Sonraki adımda, null değerlere izin vermeyecek doğrulama kuralları eklenir.
Uygulamayı çalıştırın, adresine /Movies/Indexgidin, listelenen tüm filmleri silin ve uygulamayı durdurun. Uygulama, bir sonraki çalıştırıldığında tohum verilerini kullanır.
Film modeline doğrulama kuralları ekleme
DataAnnotations ad alanı, bir sınıfa veya özelliğe bildirim temelli olarak uygulanan yerleşik doğrulama öznitelikleri kümesi sağlar. DataAnnotations biçimlendirmeye yardımcı olan ve hiçbir doğrulama sağlamayan DataType gibi biçimlendirme öznitelikleri de içerir.
Yerleşik doğrulama öznitelikleri Movie, Required, StringLength, RegularExpression ve Range biçimlendirme özniteliğinden yararlanmak için DataType sınıfını güncelleştirin.
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
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 öznitelikleri, uygulandıkları model özelliklerinde zorlamak istediğiniz davranışı belirtir:
RequiredveMinimumLengthöznitelikleri, bir özelliğin bir değere sahip olması gerektiğini belirtir, ancak hiçbir şey kullanıcının bu doğrulamayı karşılamak için boşluk girmesini engellemez.RegularExpressionözniteliği girilebilecek karakterleri sınırlamak için kullanılır. Önceki kodda "Genre":- Yalnızca harfleri kullanmalıdır.
- İlk harfin büyük harf olması gerekir. Boşluklara izin verilirken, sayılara ve özel karakterlere izin verilmez.
RegularExpression"Rating":- İlk karakterin büyük harf olmasını gerektirir.
- Sonraki alanlarda özel karakterlere ve sayılara izin verir. "PG-13" değeri derecelendirme için geçerlidir ama Tür için geçerli değildir.
Rangeözniteliği, bir değeri belirtilen bir aralık içinde kısıtlar.StringLengthözniteliği, bir dize özelliğinin uzunluk üst sınırını ve isteğe bağlı olarak en düşük uzunluğunu ayarlamanıza olanak tanır.Değer türleri (
decimal,int,float,DateTimegibi) doğal olarak gereklidir ve[Required]özniteliği gerekmez.
doğrulama kurallarının ASP.NET Core tarafından otomatik olarak uygulanması uygulamanızın daha güçlü olmasına yardımcı olur. Ayrıca, bir şeyi doğrulamayı unutamamanızı ve yanlışlıkla hatalı verilerin veritabanına girişine izin vermenizi sağlar.
Doğrulama Hatası Arayüzü
Uygulamayı çalıştırın ve Filmler denetleyicisine gidin.
Yeni bir film eklemek için Yeni Oluştur bağlantısını seçin. Formu bazı geçersiz değerlerle doldurun. jQuery istemci tarafı doğrulaması hatayı algılar algılamaz bir hata iletisi görüntüler.
Not
Ondalık alanlara ondalık virgül girmeniz mümkün olmayabilir. ABD İngilizcesi olmayan tarih biçimlerini ve ondalık ayırıcı olarak virgül (",") kullanan İngilizce dışındaki yerel ayarları desteklemek için jQuery doğrulamasını uygulamanızı küreselleştirme adımlarını atmanız gerekir. Ondalık virgül ekleme yönergeleri için GitHub yorumu 4076'ya bakın.
Formun her alanda geçersiz değer içeren uygun bir doğrulama hata iletisini otomatik olarak işlediğine dikkat edin. Hatalar hem istemci tarafında (JavaScript ve jQuery kullanılarak) hem de sunucu tarafında (kullanıcının JavaScript'i devre dışı bırakması durumunda) uygulanır.
Önemli bir avantaj, bu doğrulama kullanıcı arabirimini etkinleştirmek için MoviesController sınıfında veya Create.cshtml görünümünde tek bir kod satırını değiştirmeniz gerekmemesidir. Bu öğreticide daha önce oluşturduğunuz denetleyici ve görünümler, model sınıfının özelliklerinde Movie doğrulama özniteliklerini kullanarak belirttiğiniz doğrulama kurallarını otomatik olarak aldı. Test doğrulamasını Edit eylem metodunu kullanarak gerçekleştirin ve aynı doğrulama uygulanır.
İstemci tarafı doğrulama hataları olmadan form verileri sunucuya gönderilmez.
HTTP Post yöntemine bir durma noktası koyarak, Fiddler aracı veya F12 Geliştirici araçlarını kullanarak bunu doğrulayabilirsiniz.
Doğrulama nasıl çalışır?
Denetleyicideki veya görünümlerdeki kodda herhangi bir güncelleştirme olmadan doğrulama kullanıcı arabiriminin nasıl oluşturulduğunu merak edebilirsiniz. Aşağıdaki kod iki Create yöntemi gösterir.
// GET: Movies/Create
public IActionResult Create()
{
return View();
}
// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (ModelState.IsValid)
{
_context.Add(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(movie);
}
İlk (HTTP GET) Create eylem yöntemi ilk Oluşturma formunu görüntüler. İkinci ([HttpPost]) sürüm, form gönderisini işler. İkinci Create yöntem ( [HttpPost] Sürüm), filmin herhangi bir doğrulama hatası olup olmadığını denetlemek için çağırır ModelState.IsValid . Bu yöntemin çağrılması, nesneye uygulanmış olan tüm doğrulama özniteliklerini değerlendirir. Nesnede doğrulama hataları varsa, Create yöntemi formu yeniden görüntüler. Hata yoksa yöntemi yeni filmi veritabanına kaydeder. Film örneğimizde, istemci tarafında doğrulama hataları algılandığında form sunucuya gönderilmez; İstemci tarafı doğrulama hataları olduğunda ikinci Create yöntem hiçbir zaman çağrılmaz. Tarayıcınızda JavaScript'i devre dışı bırakırsanız istemci doğrulaması devre dışı bırakılır ve doğrulama hatalarını algılayan HTTP POST Create yöntemini ModelState.IsValid test edebilirsiniz.
yönteminde bir kesme noktası ayarlayabilir ve yöntemin [HttpPost] Create hiçbir zaman çağrılmadığını doğrulayabilirsiniz; doğrulama hataları algılandığında istemci tarafı doğrulaması form verilerini göndermez. Tarayıcınızın JavaScript'i devre dışı bırakırsanız ve oluşan hatalarla formu gönderirseniz, kesme noktası görülür. JavaScript olmadan da tam doğrulama elde edersiniz.
Aşağıdaki görüntüde Firefox tarayıcısında JavaScript'i devre dışı bırakma gösterilmektedir.
Aşağıdaki görüntüde, Chrome tarayıcısında JavaScript'in nasıl devre dışı bırakılası gösterilmektedir.
JavaScript'i devre dışı bırakdıktan sonra geçersiz veri gönderin ve hata ayıklayıcıda adım adım ilerleyin.
Görünüm şablonunun Create.cshtml bir bölümü aşağıdaki işaretlemede gösterilir:
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
@*Markup removed for brevity.*@
Önceki işaretleme, eylem yöntemleri tarafından ilk formu görüntülemek ve bir hata durumunda yeniden görüntülemek için kullanılır.
Giriş Etiketi Yardımcısı DataAnnotations özniteliklerini kullanır ve istemci tarafında jQuery Doğrulaması için gereken HTML özniteliklerini üretir. Doğrulama Etiketi Yardımcısı doğrulama hatalarını görüntüler. Daha fazla bilgi için bkz . Doğrulama .
Bu yaklaşımın hoş yanı, denetleyici veya görünüm şablonunun uygulanan gerçek doğrulama kuralları veya görüntülenen belirli hata iletileri hakkında hiçbir şey bilmemesidir. Doğrulama kuralları ve hata dizeleri yalnızca sınıfında Movie belirtilir. Bu aynı doğrulama kuralları, Edit görünümüne ve modelinizi düzenleyen başka herhangi bir görünüm şablonuna otomatik olarak uygulanır.
Doğrulama mantığını değiştirmeniz gerektiğinde, modele doğrulama öznitelikleri ekleyerek (bu örnekte Movie sınıfı) bunu tam olarak tek bir yerde yapabilirsiniz. Uygulamanın farklı bölümlerinin kuralların nasıl uygulandığıyla tutarsız olması konusunda endişelenmeniz gerekmez; tüm doğrulama mantığı tek bir yerde tanımlanır ve her yerde kullanılır. Bu, kodu çok temiz tutar ve bakımını ve gelişmesini kolaylaştırır. Bu da DRY prensibini tamamen uygulayacağınız anlamına geliyor.
DataType Özniteliklerini Kullanma
Movie.cs dosyasını açın ve Movie sınıfını inceleyin. Namespace, System.ComponentModel.DataAnnotations yerleşik doğrulama öznitelikleri kümesine ek olarak biçimlendirme öznitelikleri sağlar. Yayın tarihine ve fiyat alanlarına zaten bir DataType numaralandırma değeri uyguladık. Aşağıdaki kod, ReleaseDate ve Price özelliklerini uygun DataType özniteliği ile gösterir.
[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; }
DataType Öznitelikler yalnızca verileri biçimlendirmek için görünüm altyapısına ipuçları sağlar ve URL'ler ve <a> e-posta için gibi <a href="mailto:EmailAddress.com"> öğeler/öznitelikler sağlar. Veri biçimini doğrulamak için özniteliğini kullanabilirsiniz RegularExpression .
DataType özniteliği, veritabanı iç türünden daha özel bir veri türü belirtmek için kullanılır; bunlar doğrulama öznitelikleri değildir. Bu durumda yalnızca tarihi takip etmek istiyoruz, saati değil. Numaralandırma Tarih DataType , Saat, Telefon Numarası, Para Birimi, EmailAddress ve daha fazlası gibi birçok veri türünü sağlar. Özniteliği, DataType uygulamanın türe özgü özellikleri otomatik olarak sağlamasına da olanak sağlayabilir. Örneğin, bir mailto: bağlantısı oluşturulabilir ve HTML5'i destekleyen tarayıcılarda DataType.EmailAddress için bir tarih seçici sağlanabilir. Öznitelikler, DataType HTML 5 data- tarayıcılarının anlayabileceği HTML 5 (belirgin veri tiresi) öznitelikleri yayar.
DataType Öznitelikler herhangi bir doğrulama sağlamaz.
DataType.Date görüntülenen tarihin biçimini belirtmez. Varsayılan olarak, veri alanı sunucunun CultureInfoöğesine göre varsayılan biçimlere göre görüntülenir.
DisplayFormat özniteliği, tarih biçimini açıkça belirtmek için kullanılır:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
ayarı, ApplyFormatInEditMode değer düzenleme için bir metin kutusunda görüntülendiğinde biçimlendirmenin de uygulanması gerektiğini belirtir. (Bazı alanlarda bunu istemeyebilirsiniz; örneğin, para birimi değerleri için, büyük olasılıkla metin kutusunda para birimi simgesinin düzenlenmesini istemezsiniz.)
özniteliğini DisplayFormat tek başına kullanabilirsiniz, ancak özniteliğini DataType kullanmak genellikle iyi bir fikirdir.
DataType özniteliği, verilerin ekranda nasıl işleneceğinin aksine semantiğini iletir ve DisplayFormat ile elde etmediğiniz aşağıdaki avantajları sağlar:
Tarayıcı HTML5 özelliklerini etkinleştirebilir (örneğin, bir takvim denetimi, yerel ayara uygun para birimi simgesi, e-posta bağlantıları vb.)
Varsayılan olarak, tarayıcı yerel ayarınıza göre doğru biçimi kullanarak verileri işler.
DataTypeözniteliği, MVC'nin verileri işlemek için doğru alan şablonunu seçmesini sağlayabilir (DisplayFormatkendisi tarafından kullanılıyorsa, dize şablonunu kullanır).
Not
jQuery doğrulaması Range özniteliği ve DateTime ile çalışmaz. Örneğin, tarih belirtilen aralıkta olsa bile aşağıdaki kod her zaman bir istemci tarafı doğrulama hatası görüntüler:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Range ve DateTime ile özniteliğini kullanmak için jQuery tarih doğrulamasını devre dışı bırakmanız gerekir. Modellerinizde sabit tarihleri derlemek genellikle iyi bir uygulama değildir, bu nedenle özniteliğini Range kullanmak ve DateTime önerilmez.
Aşağıdaki kod öznitelikleri tek satırda birleştirmeyi gösterir:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
public string? Title { get; set; }
[Display(Name = "Release Date"), DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$"), Required, StringLength(30)]
public string? Genre { get; set; }
[Range(1, 100), DataType(DataType.Currency), Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$"), StringLength(5)]
public string? Rating { get; set; }
}
Migrasyonları uygula
Bazı doğrulama öznitelikleri veritabanı şemasını etkiler. Örneğin, [Required] bir sütun NOT NULL oluşturur ve [StringLength(60)] sütun türünü ile nvarchar(60)sınırlar. Veritabanı şemasının modelle tutarlı olmasını sağlamak için bir geçiş çalıştırın.
Tools menüsünden NuGet Paket Yöneticisi > Paket Yöneticisi Console öğesini seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration New_DataAnnotations
Update-Database
Serinin bir sonraki bölümünde uygulamayı gözden geçirecek ve otomatik olarak oluşturulan Details ve Delete yöntemlerinde bazı iyileştirmeler yapacağız.
İlgili içerik
Bu bölümde:
- Doğrulama mantığı modele
Movieeklenir. - Bir kullanıcı bir film oluşturduğunda veya düzenlediğinde doğrulama kurallarının zorunlu kılındığından emin olursunuz.
Öğeleri KURU TUTMA
MVC'nin tasarım tenetlerinden biri DRY 'dur ("Kendinizi Tekrar etmeyin"). ASP.NET Core MVC, işlevselliği veya davranışı yalnızca bir kez belirtmenizi ve ardından uygulamanın her yerine yansıtılmanızı sağlar. Bu, yazmanız gereken kod miktarını azaltır ve yaptığınız kodun daha az hataya açık olmasını, testini ve bakımının daha kolay olmasını sağlar.
MVC ve Entity Framework Core Code First tarafından sağlanan doğrulama desteği, DRY ilkesinin nasıl çalıştığının iyi bir örneğidir. Doğrulama kurallarını bildirimli olarak tek bir yerde (model sınıfında) belirtebilirsiniz ve kurallar uygulamanın her yerinde uygulanır.
Daha önce düzenlenen verileri silme
Sonraki adımda, null değerlere izin vermeyecek doğrulama kuralları eklenir.
Uygulamayı çalıştırın, adresine /Movies/Indexgidin, listelenen tüm filmleri silin ve uygulamayı durdurun. Uygulama, bir sonraki çalıştırıldığında tohum verilerini kullanır.
Film modeline doğrulama kuralları ekleme
DataAnnotations ad alanı, bir sınıfa veya özelliğe bildirim temelli olarak uygulanan yerleşik doğrulama öznitelikleri kümesi sağlar. DataAnnotations biçimlendirmeye yardımcı olan ve hiçbir doğrulama sağlamayan DataType gibi biçimlendirme öznitelikleri de içerir.
Yerleşik doğrulama öznitelikleri Movie, Required, StringLength, RegularExpression ve Range biçimlendirme özniteliğinden yararlanmak için DataType sınıfını güncelleştirin.
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
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 öznitelikleri, uygulandıkları model özelliklerinde zorlamak istediğiniz davranışı belirtir:
RequiredveMinimumLengthöznitelikleri, bir özelliğin bir değere sahip olması gerektiğini belirtir, ancak hiçbir şey kullanıcının bu doğrulamayı karşılamak için boşluk girmesini engellemez.RegularExpressionözniteliği girilebilecek karakterleri sınırlamak için kullanılır. Önceki kodda "Genre":- Yalnızca harfleri kullanmalıdır.
- İlk harfin büyük harf olması gerekir. Boşluklara izin verilirken, sayılara ve özel karakterlere izin verilmez.
RegularExpression"Rating":- İlk karakterin büyük harf olmasını gerektirir.
- Sonraki alanlarda özel karakterlere ve sayılara izin verir. "PG-13" değeri derecelendirme için geçerlidir ama Tür için geçerli değildir.
Rangeözniteliği, bir değeri belirtilen bir aralık içinde kısıtlar.StringLengthözniteliği, bir dize özelliğinin uzunluk üst sınırını ve isteğe bağlı olarak en düşük uzunluğunu ayarlamanıza olanak tanır.Değer türleri (
decimal,int,float,DateTimegibi) doğal olarak gereklidir ve[Required]özniteliği gerekmez.
doğrulama kurallarının ASP.NET Core tarafından otomatik olarak uygulanması uygulamanızın daha güçlü olmasına yardımcı olur. Ayrıca, bir şeyi doğrulamayı unutamamanızı ve yanlışlıkla hatalı verilerin veritabanına girişine izin vermenizi sağlar.
Doğrulama Hatası Arayüzü
Uygulamayı çalıştırın ve Filmler denetleyicisine gidin.
Yeni bir film eklemek için Yeni Oluştur bağlantısını seçin. Formu bazı geçersiz değerlerle doldurun. jQuery istemci tarafı doğrulaması hatayı algılar algılamaz bir hata iletisi görüntüler.
Not
Ondalık alanlara ondalık virgül girmeniz mümkün olmayabilir. ABD İngilizcesi olmayan tarih biçimlerini ve ondalık ayırıcı olarak virgül (",") kullanan İngilizce dışındaki yerel ayarları desteklemek için jQuery doğrulamasını uygulamanızı küreselleştirme adımlarını atmanız gerekir. Ondalık virgül ekleme yönergeleri için GitHub yorumu 4076'ya bakın.
Formun her alanda geçersiz değer içeren uygun bir doğrulama hata iletisini otomatik olarak işlediğine dikkat edin. Hatalar hem istemci tarafında (JavaScript ve jQuery kullanılarak) hem de sunucu tarafında (kullanıcının JavaScript'i devre dışı bırakması durumunda) uygulanır.
Önemli bir avantaj, bu doğrulama kullanıcı arabirimini etkinleştirmek için MoviesController sınıfında veya Create.cshtml görünümünde tek bir kod satırını değiştirmeniz gerekmemesidir. Bu öğreticide daha önce oluşturduğunuz denetleyici ve görünümler, model sınıfının özelliklerinde Movie doğrulama özniteliklerini kullanarak belirttiğiniz doğrulama kurallarını otomatik olarak aldı. Test doğrulamasını Edit eylem metodunu kullanarak gerçekleştirin ve aynı doğrulama uygulanır.
İstemci tarafı doğrulama hataları olmadan form verileri sunucuya gönderilmez.
HTTP Post yöntemine bir durma noktası koyarak, Fiddler aracı veya F12 Geliştirici araçlarını kullanarak bunu doğrulayabilirsiniz.
Doğrulama nasıl çalışır?
Denetleyicideki veya görünümlerdeki kodda herhangi bir güncelleştirme olmadan doğrulama kullanıcı arabiriminin nasıl oluşturulduğunu merak edebilirsiniz. Aşağıdaki kod iki Create yöntemi gösterir.
// GET: Movies/Create
public IActionResult Create()
{
return View();
}
// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (ModelState.IsValid)
{
_context.Add(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(movie);
}
İlk (HTTP GET) Create eylem yöntemi ilk Oluşturma formunu görüntüler. İkinci ([HttpPost]) sürüm, form gönderisini işler. İkinci Create yöntem ( [HttpPost] Sürüm), filmin herhangi bir doğrulama hatası olup olmadığını denetlemek için çağırır ModelState.IsValid . Bu yöntemin çağrılması, nesneye uygulanmış olan tüm doğrulama özniteliklerini değerlendirir. Nesnede doğrulama hataları varsa, Create yöntemi formu yeniden görüntüler. Hata yoksa yöntemi yeni filmi veritabanına kaydeder. Film örneğimizde, istemci tarafında doğrulama hataları algılandığında form sunucuya gönderilmez; İstemci tarafı doğrulama hataları olduğunda ikinci Create yöntem hiçbir zaman çağrılmaz. Tarayıcınızda JavaScript'i devre dışı bırakırsanız istemci doğrulaması devre dışı bırakılır ve doğrulama hatalarını algılayan HTTP POST Create yöntemini ModelState.IsValid test edebilirsiniz.
yönteminde bir kesme noktası ayarlayabilir ve yöntemin [HttpPost] Create hiçbir zaman çağrılmadığını doğrulayabilirsiniz; doğrulama hataları algılandığında istemci tarafı doğrulaması form verilerini göndermez. Tarayıcınızın JavaScript'i devre dışı bırakırsanız ve oluşan hatalarla formu gönderirseniz, kesme noktası görülür. JavaScript olmadan da tam doğrulama elde edersiniz.
Aşağıdaki görüntüde Firefox tarayıcısında JavaScript'i devre dışı bırakma gösterilmektedir.
Aşağıdaki görüntüde, Chrome tarayıcısında JavaScript'in nasıl devre dışı bırakılası gösterilmektedir.
JavaScript'i devre dışı bırakdıktan sonra geçersiz veri gönderin ve hata ayıklayıcıda adım adım ilerleyin.
Görünüm şablonunun Create.cshtml bir bölümü aşağıdaki işaretlemede gösterilir:
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
@*Markup removed for brevity.*@
Önceki işaretleme, eylem yöntemleri tarafından ilk formu görüntülemek ve bir hata durumunda yeniden görüntülemek için kullanılır.
Giriş Etiketi Yardımcısı DataAnnotations özniteliklerini kullanır ve istemci tarafında jQuery Doğrulaması için gereken HTML özniteliklerini üretir. Doğrulama Etiketi Yardımcısı doğrulama hatalarını görüntüler. Daha fazla bilgi için bkz . Doğrulama .
Bu yaklaşımın hoş yanı, denetleyici veya görünüm şablonunun uygulanan gerçek doğrulama kuralları veya görüntülenen belirli hata iletileri hakkında hiçbir şey bilmemesidir. Doğrulama kuralları ve hata dizeleri yalnızca sınıfında Movie belirtilir. Bu aynı doğrulama kuralları, Edit görünümüne ve modelinizi düzenleyen başka herhangi bir görünüm şablonuna otomatik olarak uygulanır.
Doğrulama mantığını değiştirmeniz gerektiğinde, modele doğrulama öznitelikleri ekleyerek (bu örnekte Movie sınıfı) bunu tam olarak tek bir yerde yapabilirsiniz. Uygulamanın farklı bölümlerinin kuralların nasıl uygulandığıyla tutarsız olması konusunda endişelenmeniz gerekmez; tüm doğrulama mantığı tek bir yerde tanımlanır ve her yerde kullanılır. Bu, kodu çok temiz tutar ve bakımını ve gelişmesini kolaylaştırır. Bu da DRY prensibini tamamen uygulayacağınız anlamına geliyor.
DataType Özniteliklerini Kullanma
Movie.cs dosyasını açın ve Movie sınıfını inceleyin. Namespace, System.ComponentModel.DataAnnotations yerleşik doğrulama öznitelikleri kümesine ek olarak biçimlendirme öznitelikleri sağlar. Yayın tarihine ve fiyat alanlarına zaten bir DataType numaralandırma değeri uyguladık. Aşağıdaki kod, ReleaseDate ve Price özelliklerini uygun DataType özniteliği ile gösterir.
[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; }
DataType Öznitelikler yalnızca verileri biçimlendirmek için görünüm altyapısına ipuçları sağlar ve URL'ler ve <a> e-posta için gibi <a href="mailto:EmailAddress.com"> öğeler/öznitelikler sağlar. Veri biçimini doğrulamak için özniteliğini kullanabilirsiniz RegularExpression .
DataType özniteliği, veritabanı iç türünden daha özel bir veri türü belirtmek için kullanılır; bunlar doğrulama öznitelikleri değildir. Bu durumda yalnızca tarihi takip etmek istiyoruz, saati değil. Numaralandırma Tarih DataType , Saat, Telefon Numarası, Para Birimi, EmailAddress ve daha fazlası gibi birçok veri türünü sağlar. Özniteliği, DataType uygulamanın türe özgü özellikleri otomatik olarak sağlamasına da olanak sağlayabilir. Örneğin, bir mailto: bağlantısı oluşturulabilir ve HTML5'i destekleyen tarayıcılarda DataType.EmailAddress için bir tarih seçici sağlanabilir. Öznitelikler, DataType HTML 5 data- tarayıcılarının anlayabileceği HTML 5 (belirgin veri tiresi) öznitelikleri yayar.
DataType Öznitelikler herhangi bir doğrulama sağlamaz.
DataType.Date görüntülenen tarihin biçimini belirtmez. Varsayılan olarak, veri alanı sunucunun CultureInfoöğesine göre varsayılan biçimlere göre görüntülenir.
DisplayFormat özniteliği, tarih biçimini açıkça belirtmek için kullanılır:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
ayarı, ApplyFormatInEditMode değer düzenleme için bir metin kutusunda görüntülendiğinde biçimlendirmenin de uygulanması gerektiğini belirtir. (Bazı alanlarda bunu istemeyebilirsiniz; örneğin, para birimi değerleri için, büyük olasılıkla metin kutusunda para birimi simgesinin düzenlenmesini istemezsiniz.)
özniteliğini DisplayFormat tek başına kullanabilirsiniz, ancak özniteliğini DataType kullanmak genellikle iyi bir fikirdir.
DataType özniteliği, verilerin ekranda nasıl işleneceğinin aksine semantiğini iletir ve DisplayFormat ile elde etmediğiniz aşağıdaki avantajları sağlar:
Tarayıcı HTML5 özelliklerini etkinleştirebilir (örneğin, bir takvim denetimi, yerel ayara uygun para birimi simgesi, e-posta bağlantıları vb.)
Varsayılan olarak, tarayıcı yerel ayarınıza göre doğru biçimi kullanarak verileri işler.
DataTypeözniteliği, MVC'nin verileri işlemek için doğru alan şablonunu seçmesini sağlayabilir (DisplayFormatkendisi tarafından kullanılıyorsa, dize şablonunu kullanır).
Not
jQuery doğrulaması Range özniteliği ve DateTime ile çalışmaz. Örneğin, tarih belirtilen aralıkta olsa bile aşağıdaki kod her zaman bir istemci tarafı doğrulama hatası görüntüler:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Range ve DateTime ile özniteliğini kullanmak için jQuery tarih doğrulamasını devre dışı bırakmanız gerekir. Modellerinizde sabit tarihleri derlemek genellikle iyi bir uygulama değildir, bu nedenle özniteliğini Range kullanmak ve DateTime önerilmez.
Aşağıdaki kod öznitelikleri tek satırda birleştirmeyi gösterir:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
public string Title { get; set; }
[Display(Name = "Release Date"), DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$"), Required, StringLength(30)]
public string Genre { get; set; }
[Range(1, 100), DataType(DataType.Currency)]
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$"), StringLength(5)]
public string Rating { get; set; }
}
Migrasyonları uygula
Bazı doğrulama öznitelikleri veritabanı şemasını etkiler. Örneğin, [Required] bir sütun NOT NULL oluşturur ve [StringLength(60)] sütun türünü ile nvarchar(60)sınırlar. Veritabanı şemasının modelle tutarlı olmasını sağlamak için bir geçiş çalıştırın.
Tools menüsünden NuGet Paket Yöneticisi > Paket Yöneticisi Console öğesini seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration New_DataAnnotations
Update-Database
Serinin bir sonraki bölümünde uygulamayı gözden geçirecek ve otomatik olarak oluşturulan Details ve Delete yöntemlerinde bazı iyileştirmeler yapacağız.
İlgili içerik
Bu bölümde:
- Doğrulama mantığı modele
Movieeklenir. - Bir kullanıcı bir film oluşturduğunda veya düzenlediğinde doğrulama kurallarının zorunlu kılındığından emin olursunuz.
Öğeleri KURU TUTMA
MVC'nin tasarım tenetlerinden biri DRY 'dur ("Kendinizi Tekrar etmeyin"). ASP.NET Core MVC, işlevselliği veya davranışı yalnızca bir kez belirtmenizi ve ardından uygulamanın her yerine yansıtılmanızı sağlar. Bu, yazmanız gereken kod miktarını azaltır ve yaptığınız kodun daha az hataya açık olmasını, testini ve bakımının daha kolay olmasını sağlar.
MVC ve Entity Framework Core Code First tarafından sağlanan doğrulama desteği, DRY ilkesinin nasıl çalıştığının iyi bir örneğidir. Doğrulama kurallarını bildirimli olarak tek bir yerde (model sınıfında) belirtebilirsiniz ve kurallar uygulamanın her yerinde uygulanır.
Film modeline doğrulama kuralları ekleme
DataAnnotations ad alanı, bir sınıfa veya özelliğe bildirim temelli olarak uygulanan yerleşik doğrulama öznitelikleri kümesi sağlar. DataAnnotations biçimlendirmeye yardımcı olan ve hiçbir doğrulama sağlamayan DataType gibi biçimlendirme öznitelikleri de içerir.
Yerleşik doğrulama öznitelikleri Movie, Required, StringLength, RegularExpression ve Range biçimlendirme özniteliğinden yararlanmak için DataType sınıfını güncelleştirin.
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
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 öznitelikleri, uygulandıkları model özelliklerinde zorlamak istediğiniz davranışı belirtir:
RequiredveMinimumLengthöznitelikleri, bir özelliğin bir değere sahip olması gerektiğini belirtir, ancak hiçbir şey kullanıcının bu doğrulamayı karşılamak için boşluk girmesini engellemez.RegularExpressionözniteliği girilebilecek karakterleri sınırlamak için kullanılır. Önceki kodda "Genre":- Yalnızca harfleri kullanmalıdır.
- İlk harfin büyük harf olması gerekir. Boşluklara izin verilirken, sayılara ve özel karakterlere izin verilmez.
RegularExpression"Rating":- İlk karakterin büyük harf olmasını gerektirir.
- Sonraki alanlarda özel karakterlere ve sayılara izin verir. "PG-13" değeri derecelendirme için geçerlidir ama Tür için geçerli değildir.
Rangeözniteliği, bir değeri belirtilen bir aralık içinde kısıtlar.StringLengthözniteliği, bir dize özelliğinin uzunluk üst sınırını ve isteğe bağlı olarak en düşük uzunluğunu ayarlamanıza olanak tanır.Değer türleri (
decimal,int,float,DateTimegibi) doğal olarak gereklidir ve[Required]özniteliği gerekmez.
doğrulama kurallarının ASP.NET Core tarafından otomatik olarak uygulanması uygulamanızın daha güçlü olmasına yardımcı olur. Ayrıca, bir şeyi doğrulamayı unutamamanızı ve yanlışlıkla hatalı verilerin veritabanına girişine izin vermenizi sağlar.
Doğrulama Hatası Arayüzü
Uygulamayı çalıştırın ve Filmler denetleyicisine gidin.
Yeni bir film eklemek için Yeni Oluştur bağlantısını seçin. Formu bazı geçersiz değerlerle doldurun. jQuery istemci tarafı doğrulaması hatayı algılar algılamaz bir hata iletisi görüntüler.
Not
Ondalık alanlara ondalık virgül girmeniz mümkün olmayabilir. ABD İngilizcesi olmayan tarih biçimlerini ve ondalık ayırıcı olarak virgül (",") kullanan İngilizce dışındaki yerel ayarları desteklemek için jQuery doğrulamasını uygulamanızı küreselleştirme adımlarını atmanız gerekir. Ondalık virgül ekleme yönergeleri için GitHub yorumu 4076'ya bakın.
Formun her alanda geçersiz değer içeren uygun bir doğrulama hata iletisini otomatik olarak işlediğine dikkat edin. Hatalar hem istemci tarafında (JavaScript ve jQuery kullanılarak) hem de sunucu tarafında (kullanıcının JavaScript'i devre dışı bırakması durumunda) uygulanır.
Önemli bir avantaj, bu doğrulama kullanıcı arabirimini etkinleştirmek için MoviesController sınıfında veya Create.cshtml görünümünde tek bir kod satırını değiştirmeniz gerekmemesidir. Bu öğreticide daha önce oluşturduğunuz denetleyici ve görünümler, model sınıfının özelliklerinde Movie doğrulama özniteliklerini kullanarak belirttiğiniz doğrulama kurallarını otomatik olarak aldı. Test doğrulamasını Edit eylem metodunu kullanarak gerçekleştirin ve aynı doğrulama uygulanır.
İstemci tarafı doğrulama hataları olmadan form verileri sunucuya gönderilmez.
HTTP Post yöntemine bir durma noktası koyarak, Fiddler aracı veya F12 Geliştirici araçlarını kullanarak bunu doğrulayabilirsiniz.
Doğrulama nasıl çalışır?
Denetleyicideki veya görünümlerdeki kodda herhangi bir güncelleştirme olmadan doğrulama kullanıcı arabiriminin nasıl oluşturulduğunu merak edebilirsiniz. Aşağıdaki kod iki Create yöntemi gösterir.
// GET: Movies/Create
public IActionResult Create()
{
return View();
}
// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (ModelState.IsValid)
{
_context.Add(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(movie);
}
İlk (HTTP GET) Create eylem yöntemi ilk Oluşturma formunu görüntüler. İkinci ([HttpPost]) sürüm, form gönderisini işler. İkinci Create yöntem ( [HttpPost] Sürüm), filmin herhangi bir doğrulama hatası olup olmadığını denetlemek için çağırır ModelState.IsValid . Bu yöntemin çağrılması, nesneye uygulanmış olan tüm doğrulama özniteliklerini değerlendirir. Nesnede doğrulama hataları varsa, Create yöntemi formu yeniden görüntüler. Hata yoksa yöntemi yeni filmi veritabanına kaydeder. Film örneğimizde, istemci tarafında doğrulama hataları algılandığında form sunucuya gönderilmez; İstemci tarafı doğrulama hataları olduğunda ikinci Create yöntem hiçbir zaman çağrılmaz. Tarayıcınızda JavaScript'i devre dışı bırakırsanız istemci doğrulaması devre dışı bırakılır ve doğrulama hatalarını algılayan HTTP POST Create yöntemini ModelState.IsValid test edebilirsiniz.
yönteminde bir kesme noktası ayarlayabilir ve yöntemin [HttpPost] Create hiçbir zaman çağrılmadığını doğrulayabilirsiniz; doğrulama hataları algılandığında istemci tarafı doğrulaması form verilerini göndermez. Tarayıcınızın JavaScript'i devre dışı bırakırsanız ve oluşan hatalarla formu gönderirseniz, kesme noktası görülür. JavaScript olmadan da tam doğrulama elde edersiniz.
Aşağıdaki görüntüde Firefox tarayıcısında JavaScript'i devre dışı bırakma gösterilmektedir.
Aşağıdaki görüntüde, Chrome tarayıcısında JavaScript'in nasıl devre dışı bırakılası gösterilmektedir.
JavaScript'i devre dışı bırakdıktan sonra geçersiz veri gönderin ve hata ayıklayıcıda adım adım ilerleyin.
Görünüm şablonunun Create.cshtml bir bölümü aşağıdaki işaretlemede gösterilir:
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
@*Markup removed for brevity.*@
Önceki işaretleme, eylem yöntemleri tarafından ilk formu görüntülemek ve bir hata durumunda yeniden görüntülemek için kullanılır.
Giriş Etiketi Yardımcısı DataAnnotations özniteliklerini kullanır ve istemci tarafında jQuery Doğrulaması için gereken HTML özniteliklerini üretir. Doğrulama Etiketi Yardımcısı doğrulama hatalarını görüntüler. Daha fazla bilgi için bkz . Doğrulama .
Bu yaklaşımın hoş yanı, denetleyici veya görünüm şablonunun uygulanan gerçek doğrulama kuralları veya görüntülenen belirli hata iletileri hakkında hiçbir şey bilmemesidir. Doğrulama kuralları ve hata dizeleri yalnızca sınıfında Movie belirtilir. Bu aynı doğrulama kuralları, Edit görünümüne ve modelinizi düzenleyen başka herhangi bir görünüm şablonuna otomatik olarak uygulanır.
Doğrulama mantığını değiştirmeniz gerektiğinde, modele doğrulama öznitelikleri ekleyerek (bu örnekte Movie sınıfı) bunu tam olarak tek bir yerde yapabilirsiniz. Uygulamanın farklı bölümlerinin kuralların nasıl uygulandığıyla tutarsız olması konusunda endişelenmeniz gerekmez; tüm doğrulama mantığı tek bir yerde tanımlanır ve her yerde kullanılır. Bu, kodu çok temiz tutar ve bakımını ve gelişmesini kolaylaştırır. Bu da DRY prensibini tamamen uygulayacağınız anlamına geliyor.
DataType Özniteliklerini Kullanma
Movie.cs dosyasını açın ve Movie sınıfını inceleyin. Namespace, System.ComponentModel.DataAnnotations yerleşik doğrulama öznitelikleri kümesine ek olarak biçimlendirme öznitelikleri sağlar. Yayın tarihine ve fiyat alanlarına zaten bir DataType numaralandırma değeri uyguladık. Aşağıdaki kod, ReleaseDate ve Price özelliklerini uygun DataType özniteliği ile gösterir.
[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; }
DataType Öznitelikler yalnızca verileri biçimlendirmek için görünüm altyapısına ipuçları sağlar ve URL'ler ve <a> e-posta için gibi <a href="mailto:EmailAddress.com"> öğeler/öznitelikler sağlar. Veri biçimini doğrulamak için özniteliğini kullanabilirsiniz RegularExpression .
DataType özniteliği, veritabanı iç türünden daha özel bir veri türü belirtmek için kullanılır; bunlar doğrulama öznitelikleri değildir. Bu durumda yalnızca tarihi takip etmek istiyoruz, saati değil. Numaralandırma Tarih DataType , Saat, Telefon Numarası, Para Birimi, EmailAddress ve daha fazlası gibi birçok veri türünü sağlar. Özniteliği, DataType uygulamanın türe özgü özellikleri otomatik olarak sağlamasına da olanak sağlayabilir. Örneğin, bir mailto: bağlantısı oluşturulabilir ve HTML5'i destekleyen tarayıcılarda DataType.EmailAddress için bir tarih seçici sağlanabilir. Öznitelikler, DataType HTML 5 data- tarayıcılarının anlayabileceği HTML 5 (belirgin veri tiresi) öznitelikleri yayar.
DataType Öznitelikler herhangi bir doğrulama sağlamaz.
DataType.Date görüntülenen tarihin biçimini belirtmez. Varsayılan olarak, veri alanı sunucunun CultureInfoöğesine göre varsayılan biçimlere göre görüntülenir.
DisplayFormat özniteliği, tarih biçimini açıkça belirtmek için kullanılır:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
ayarı, ApplyFormatInEditMode değer düzenleme için bir metin kutusunda görüntülendiğinde biçimlendirmenin de uygulanması gerektiğini belirtir. (Bazı alanlarda bunu istemeyebilirsiniz; örneğin, para birimi değerleri için, büyük olasılıkla metin kutusunda para birimi simgesinin düzenlenmesini istemezsiniz.)
özniteliğini DisplayFormat tek başına kullanabilirsiniz, ancak özniteliğini DataType kullanmak genellikle iyi bir fikirdir.
DataType özniteliği, verilerin ekranda nasıl işleneceğinin aksine semantiğini iletir ve DisplayFormat ile elde etmediğiniz aşağıdaki avantajları sağlar:
Tarayıcı HTML5 özelliklerini etkinleştirebilir (örneğin, bir takvim denetimi, yerel ayara uygun para birimi simgesi, e-posta bağlantıları vb.)
Varsayılan olarak, tarayıcı yerel ayarınıza göre doğru biçimi kullanarak verileri işler.
DataTypeözniteliği, MVC'nin verileri işlemek için doğru alan şablonunu seçmesini sağlayabilir (DisplayFormatkendisi tarafından kullanılıyorsa, dize şablonunu kullanır).
Not
jQuery doğrulaması Range özniteliği ve DateTime ile çalışmaz. Örneğin, tarih belirtilen aralıkta olsa bile aşağıdaki kod her zaman bir istemci tarafı doğrulama hatası görüntüler:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Range ve DateTime ile özniteliğini kullanmak için jQuery tarih doğrulamasını devre dışı bırakmanız gerekir. Modellerinizde sabit tarihleri derlemek genellikle iyi bir uygulama değildir, bu nedenle özniteliğini Range kullanmak ve DateTime önerilmez.
Aşağıdaki kod öznitelikleri tek satırda birleştirmeyi gösterir:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models;
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
public string Title { get; set; }
[Display(Name = "Release Date"), DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$"), Required, StringLength(30)]
public string Genre { get; set; }
[Range(1, 100), DataType(DataType.Currency)]
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$"), StringLength(5)]
public string Rating { get; set; }
}
Migrasyonları uygula
Bazı doğrulama öznitelikleri veritabanı şemasını etkiler. Örneğin, [Required] bir sütun NOT NULL oluşturur ve [StringLength(60)] sütun türünü ile nvarchar(60)sınırlar. Veritabanı şemasının modelle tutarlı olmasını sağlamak için bir geçiş çalıştırın.
Tools menüsünden NuGet Paket Yöneticisi > Paket Yöneticisi Console öğesini seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration New_DataAnnotations
Update-Database
Bu bölümde:
- Doğrulama mantığı modele
Movieeklenir. - Bir kullanıcı bir film oluşturduğunda veya düzenlediğinde doğrulama kurallarının zorunlu kılındığından emin olursunuz.
Öğeleri KURU TUTMA
MVC'nin tasarım tenetlerinden biri DRY 'dur ("Kendinizi Tekrar etmeyin"). ASP.NET Core MVC, işlevselliği veya davranışı yalnızca bir kez belirtmenizi ve ardından uygulamanın her yerine yansıtılmanızı sağlar. Bu, yazmanız gereken kod miktarını azaltır ve yaptığınız kodun daha az hataya açık olmasını, testini ve bakımının daha kolay olmasını sağlar.
MVC ve Entity Framework Core Code First tarafından sağlanan doğrulama desteği, DRY ilkesinin nasıl çalıştığının iyi bir örneğidir. Doğrulama kurallarını bildirimli olarak tek bir yerde (model sınıfında) belirtebilirsiniz ve kurallar uygulamanın her yerinde uygulanır.
Film modeline doğrulama kuralları ekleme
DataAnnotations ad alanı, bir sınıfa veya özelliğe bildirim temelli olarak uygulanan yerleşik doğrulama öznitelikleri kümesi sağlar. DataAnnotations biçimlendirmeye yardımcı olan ve hiçbir doğrulama sağlamayan DataType gibi biçimlendirme öznitelikleri de içerir.
Movie sınıfını, yerleşik Required, StringLength, RegularExpression ve Range doğrulama özniteliklerinden yararlanacak şekilde güncelleyin.
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models
{
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 öznitelikleri, uygulandıkları model özelliklerinde zorlamak istediğiniz davranışı belirtir:
RequiredveMinimumLengthöznitelikleri, bir özelliğin bir değere sahip olması gerektiğini belirtir, ancak hiçbir şey kullanıcının bu doğrulamayı karşılamak için boşluk girmesini engellemez.RegularExpressionözniteliği girilebilecek karakterleri sınırlamak için kullanılır. Önceki kodda "Genre":- Yalnızca harfleri kullanmalıdır.
- İlk harfin büyük harf olması gerekir. Boşluklara izin verilirken, sayılara ve özel karakterlere izin verilmez.
RegularExpression"Rating":- İlk karakterin büyük harf olmasını gerektirir.
- Sonraki alanlarda özel karakterlere ve sayılara izin verir. "PG-13" değeri derecelendirme için geçerlidir ama Tür için geçerli değildir.
Rangeözniteliği, bir değeri belirtilen bir aralık içinde kısıtlar.StringLengthözniteliği, bir dize özelliğinin uzunluk üst sınırını ve isteğe bağlı olarak en düşük uzunluğunu ayarlamanıza olanak tanır.Değer türleri (
decimal,int,float,DateTimegibi) doğal olarak gereklidir ve[Required]özniteliği gerekmez.
doğrulama kurallarının ASP.NET Core tarafından otomatik olarak uygulanması uygulamanızın daha güçlü olmasına yardımcı olur. Ayrıca, bir şeyi doğrulamayı unutamamanızı ve yanlışlıkla hatalı verilerin veritabanına girişine izin vermenizi sağlar.
Doğrulama Hatası Arayüzü
Uygulamayı çalıştırın ve Filmler denetleyicisine gidin.
Yeni bir film eklemek için Yeni Oluştur bağlantısını seçin. Formu bazı geçersiz değerlerle doldurun. jQuery istemci tarafı doğrulaması hatayı algılar algılamaz bir hata iletisi görüntüler.
Not
Ondalık alanlara ondalık virgül girmeniz mümkün olmayabilir. ABD İngilizcesi olmayan tarih biçimlerini ve ondalık ayırıcı olarak virgül (",") kullanan İngilizce dışındaki yerel ayarları desteklemek için jQuery doğrulamasını uygulamanızı küreselleştirme adımlarını atmanız gerekir. Ondalık virgül ekleme yönergeleri için GitHub yorumu 4076'ya bakın.
Formun her alanda geçersiz değer içeren uygun bir doğrulama hata iletisini otomatik olarak işlediğine dikkat edin. Hatalar hem istemci tarafında (JavaScript ve jQuery kullanılarak) hem de sunucu tarafında (kullanıcının JavaScript'i devre dışı bırakması durumunda) uygulanır.
Önemli bir avantaj, bu doğrulama kullanıcı arabirimini etkinleştirmek için MoviesController sınıfında veya Create.cshtml görünümünde tek bir kod satırını değiştirmeniz gerekmemesidir. Bu öğreticide daha önce oluşturduğunuz denetleyici ve görünümler, model sınıfının özelliklerinde Movie doğrulama özniteliklerini kullanarak belirttiğiniz doğrulama kurallarını otomatik olarak aldı. Test doğrulamasını Edit eylem metodunu kullanarak gerçekleştirin ve aynı doğrulama uygulanır.
İstemci tarafı doğrulama hataları olmadan form verileri sunucuya gönderilmez.
HTTP Post yöntemine bir durma noktası koyarak, Fiddler aracı veya F12 Geliştirici araçlarını kullanarak bunu doğrulayabilirsiniz.
Doğrulama nasıl çalışır?
Denetleyicideki veya görünümlerdeki kodda herhangi bir güncelleştirme olmadan doğrulama kullanıcı arabiriminin nasıl oluşturulduğunu merak edebilirsiniz. Aşağıdaki kod iki Create yöntemi gösterir.
// GET: Movies/Create
public IActionResult Create()
{
return View();
}
// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (ModelState.IsValid)
{
_context.Add(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(movie);
}
İlk (HTTP GET) Create eylem yöntemi ilk Oluşturma formunu görüntüler. İkinci ([HttpPost]) sürüm, form gönderisini işler. İkinci Create yöntem ( [HttpPost] Sürüm), filmin herhangi bir doğrulama hatası olup olmadığını denetlemek için çağırır ModelState.IsValid . Bu yöntemin çağrılması, nesneye uygulanmış olan tüm doğrulama özniteliklerini değerlendirir. Nesnede doğrulama hataları varsa, Create yöntemi formu yeniden görüntüler. Hata yoksa yöntemi yeni filmi veritabanına kaydeder. Film örneğimizde, istemci tarafında doğrulama hataları algılandığında form sunucuya gönderilmez; İstemci tarafı doğrulama hataları olduğunda ikinci Create yöntem hiçbir zaman çağrılmaz. Tarayıcınızda JavaScript'i devre dışı bırakırsanız istemci doğrulaması devre dışı bırakılır ve doğrulama hatalarını algılayan HTTP POST Create yöntemini ModelState.IsValid test edebilirsiniz.
yönteminde bir kesme noktası ayarlayabilir ve yöntemin [HttpPost] Create hiçbir zaman çağrılmadığını doğrulayabilirsiniz; doğrulama hataları algılandığında istemci tarafı doğrulaması form verilerini göndermez. Tarayıcınızın JavaScript'i devre dışı bırakırsanız ve oluşan hatalarla formu gönderirseniz, kesme noktası görülür. JavaScript olmadan da tam doğrulama elde edersiniz.
Aşağıdaki görüntüde Firefox tarayıcısında JavaScript'i devre dışı bırakma gösterilmektedir.
Aşağıdaki görüntüde, Chrome tarayıcısında JavaScript'in nasıl devre dışı bırakılası gösterilmektedir.
JavaScript'i devre dışı bırakdıktan sonra geçersiz veri gönderin ve hata ayıklayıcıda adım adım ilerleyin.
Görünüm şablonunun Create.cshtml bir bölümü aşağıdaki işaretlemede gösterilir:
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
@*Markup removed for brevity.*@
Önceki işaretleme, eylem yöntemleri tarafından ilk formu görüntülemek ve bir hata durumunda yeniden görüntülemek için kullanılır.
Giriş Etiketi Yardımcısı DataAnnotations özniteliklerini kullanır ve istemci tarafında jQuery Doğrulaması için gereken HTML özniteliklerini üretir. Doğrulama Etiketi Yardımcısı doğrulama hatalarını görüntüler. Daha fazla bilgi için bkz . Doğrulama .
Bu yaklaşımın hoş yanı, denetleyici veya görünüm şablonunun uygulanan gerçek doğrulama kuralları veya görüntülenen belirli hata iletileri hakkında hiçbir şey bilmemesidir. Doğrulama kuralları ve hata dizeleri yalnızca sınıfında Movie belirtilir. Bu aynı doğrulama kuralları, Edit görünümüne ve modelinizi düzenleyen başka herhangi bir görünüm şablonuna otomatik olarak uygulanır.
Doğrulama mantığını değiştirmeniz gerektiğinde, modele doğrulama öznitelikleri ekleyerek (bu örnekte Movie sınıfı) bunu tam olarak tek bir yerde yapabilirsiniz. Uygulamanın farklı bölümlerinin kuralların nasıl uygulandığıyla tutarsız olması konusunda endişelenmeniz gerekmez; tüm doğrulama mantığı tek bir yerde tanımlanır ve her yerde kullanılır. Bu, kodu çok temiz tutar ve bakımını ve gelişmesini kolaylaştırır. Bu da DRY prensibini tamamen uygulayacağınız anlamına geliyor.
DataType Özniteliklerini Kullanma
Movie.cs dosyasını açın ve Movie sınıfını inceleyin. Namespace, System.ComponentModel.DataAnnotations yerleşik doğrulama öznitelikleri kümesine ek olarak biçimlendirme öznitelikleri sağlar. Yayın tarihine ve fiyat alanlarına zaten bir DataType numaralandırma değeri uyguladık. Aşağıdaki kod, ReleaseDate ve Price özelliklerini uygun DataType özniteliği ile gösterir.
[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; }
DataType Öznitelikler yalnızca verileri biçimlendirmek için görünüm altyapısına ipuçları sağlar ve URL'ler ve <a> e-posta için gibi <a href="mailto:EmailAddress.com"> öğeler/öznitelikler sağlar. Veri biçimini doğrulamak için özniteliğini kullanabilirsiniz RegularExpression .
DataType özniteliği, veritabanı iç türünden daha özel bir veri türü belirtmek için kullanılır; bunlar doğrulama öznitelikleri değildir. Bu durumda yalnızca tarihi takip etmek istiyoruz, saati değil. Numaralandırma Tarih DataType , Saat, Telefon Numarası, Para Birimi, EmailAddress ve daha fazlası gibi birçok veri türünü sağlar. Özniteliği, DataType uygulamanın türe özgü özellikleri otomatik olarak sağlamasına da olanak sağlayabilir. Örneğin, bir mailto: bağlantısı oluşturulabilir ve HTML5'i destekleyen tarayıcılarda DataType.EmailAddress için bir tarih seçici sağlanabilir. Öznitelikler, DataType HTML 5 data- tarayıcılarının anlayabileceği HTML 5 (belirgin veri tiresi) öznitelikleri yayar.
DataType Öznitelikler herhangi bir doğrulama sağlamaz.
DataType.Date görüntülenen tarihin biçimini belirtmez. Varsayılan olarak, veri alanı sunucunun CultureInfoöğesine göre varsayılan biçimlere göre görüntülenir.
DisplayFormat özniteliği, tarih biçimini açıkça belirtmek için kullanılır:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
ayarı, ApplyFormatInEditMode değer düzenleme için bir metin kutusunda görüntülendiğinde biçimlendirmenin de uygulanması gerektiğini belirtir. (Bazı alanlarda bunu istemeyebilirsiniz; örneğin, para birimi değerleri için, büyük olasılıkla metin kutusunda para birimi simgesinin düzenlenmesini istemezsiniz.)
özniteliğini DisplayFormat tek başına kullanabilirsiniz, ancak özniteliğini DataType kullanmak genellikle iyi bir fikirdir.
DataType özniteliği, verilerin ekranda nasıl işleneceğinin aksine semantiğini iletir ve DisplayFormat ile elde etmediğiniz aşağıdaki avantajları sağlar:
Tarayıcı HTML5 özelliklerini etkinleştirebilir (örneğin, bir takvim denetimi, yerel ayara uygun para birimi simgesi, e-posta bağlantıları vb.)
Varsayılan olarak, tarayıcı yerel ayarınıza göre doğru biçimi kullanarak verileri işler.
DataTypeözniteliği, MVC'nin verileri işlemek için doğru alan şablonunu seçmesini sağlayabilir (DisplayFormatkendisi tarafından kullanılıyorsa, dize şablonunu kullanır).
Not
jQuery doğrulaması Range özniteliği ve DateTime ile çalışmaz. Örneğin, tarih belirtilen aralıkta olsa bile aşağıdaki kod her zaman bir istemci tarafı doğrulama hatası görüntüler:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Range ve DateTime ile özniteliğini kullanmak için jQuery tarih doğrulamasını devre dışı bırakmanız gerekir. Modellerinizde sabit tarihleri derlemek genellikle iyi bir uygulama değildir, bu nedenle özniteliğini Range kullanmak ve DateTime önerilmez.
Aşağıdaki kod öznitelikleri tek satırda birleştirmeyi gösterir:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models
{
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
public string Title { get; set; }
[Display(Name = "Release Date"), DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$"), Required, StringLength(30)]
public string Genre { get; set; }
[Range(1, 100), DataType(DataType.Currency)]
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$"), StringLength(5)]
public string Rating { get; set; }
}
}
Migrasyonları uygula
Bazı doğrulama öznitelikleri veritabanı şemasını etkiler. Örneğin, [Required] bir sütun NOT NULL oluşturur ve [StringLength(60)] sütun türünü ile nvarchar(60)sınırlar. Veritabanı şemasının modelle tutarlı olmasını sağlamak için bir geçiş çalıştırın.
Tools menüsünden NuGet Paket Yöneticisi > Paket Yöneticisi Console öğesini seçin.
PMC'de aşağıdaki komutları girin:
Add-Migration New_DataAnnotations
Update-Database
Serinin bir sonraki bölümünde uygulamayı gözden geçirecek ve otomatik olarak oluşturulan Details ve Delete yöntemlerinde bazı iyileştirmeler yapacağız.
İlgili içerik
Bu bölümde:
- Doğrulama mantığı modele
Movieeklenir. - Bir kullanıcı bir film oluşturduğunda veya düzenlediğinde doğrulama kurallarının zorunlu kılındığından emin olursunuz.
Öğeleri KURU TUTMA
MVC'nin tasarım tenetlerinden biri DRY 'dur ("Kendinizi Tekrar etmeyin"). ASP.NET Core MVC, işlevselliği veya davranışı yalnızca bir kez belirtmenizi ve ardından uygulamanın her yerine yansıtılmanızı sağlar. Bu, yazmanız gereken kod miktarını azaltır ve yaptığınız kodun daha az hataya açık olmasını, testini ve bakımının daha kolay olmasını sağlar.
MVC ve Entity Framework Core Code First tarafından sağlanan doğrulama desteği, DRY ilkesinin nasıl çalıştığının iyi bir örneğidir. Doğrulama kurallarını bildirimli olarak tek bir yerde (model sınıfında) belirtebilirsiniz ve kurallar uygulamanın her yerinde uygulanır.
Film modeline doğrulama kuralları ekleme
DataAnnotations ad alanı, bir sınıfa veya özelliğe bildirim temelli olarak uygulanan yerleşik doğrulama öznitelikleri kümesi sağlar. DataAnnotations biçimlendirmeye yardımcı olan ve hiçbir doğrulama sağlamayan DataType gibi biçimlendirme öznitelikleri de içerir.
Movie sınıfını, yerleşik Required, StringLength, RegularExpression ve Range doğrulama özniteliklerinden yararlanacak şekilde güncelleyin.
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 öznitelikleri, uygulandıkları model özelliklerinde zorlamak istediğiniz davranışı belirtir:
RequiredveMinimumLengthöznitelikleri, bir özelliğin bir değere sahip olması gerektiğini belirtir, ancak hiçbir şey kullanıcının bu doğrulamayı karşılamak için boşluk girmesini engellemez.RegularExpressionözniteliği girilebilecek karakterleri sınırlamak için kullanılır. Önceki kodda "Genre":- Yalnızca harfleri kullanmalıdır.
- İlk harf büyük harf olmalıdır. Boşluklara izin verilirken sayılara ve özel karakterlere izin verilmez.
RegularExpression"Rating":- İlk karakterin büyük harf olmasını gerektirir.
- Sonraki alanlarda özel karakterlere ve sayılara izin verir. "PG-13" değeri derecelendirme için geçerlidir ama Tür için geçerli değildir.
Rangeözniteliği, bir değeri belirtilen bir aralık içinde kısıtlar.StringLengthözniteliği, bir dize özelliğinin uzunluk üst sınırını ve isteğe bağlı olarak en düşük uzunluğunu ayarlamanıza olanak tanır.Değer türleri (
decimal,int,float,DateTimegibi) doğal olarak gereklidir ve[Required]özniteliği gerekmez.
doğrulama kurallarının ASP.NET Core tarafından otomatik olarak uygulanması uygulamanızın daha güçlü olmasına yardımcı olur. Ayrıca, bir şeyi doğrulamayı unutamamanızı ve yanlışlıkla hatalı verilerin veritabanına girişine izin vermenizi sağlar.
Doğrulama Hatası Arayüzü
Uygulamayı çalıştırın ve Filmler denetleyicisine gidin.
Yeni film eklemek için Yeni Oluştur bağlantısına dokunun. Formu bazı geçersiz değerlerle doldurun. jQuery istemci tarafı doğrulaması hatayı algılar algılamaz bir hata iletisi görüntüler.
Not
Ondalık alanlara ondalık virgül girmeniz mümkün olmayabilir. ABD İngilizcesi olmayan tarih biçimlerini ve ondalık ayırıcı olarak virgül (",") kullanan İngilizce dışındaki yerel ayarları desteklemek için jQuery doğrulamasını uygulamanızı küreselleştirme adımlarını atmanız gerekir. Ondalık virgül ekleme yönergeleri için GitHub yorumu 4076'ya bakın.
Formun her alanda geçersiz değer içeren uygun bir doğrulama hata iletisini otomatik olarak işlediğine dikkat edin. Hatalar hem istemci tarafında (JavaScript ve jQuery kullanılarak) hem de sunucu tarafında (kullanıcının JavaScript'i devre dışı bırakması durumunda) uygulanır.
Önemli bir avantaj, bu doğrulama kullanıcı arabirimini etkinleştirmek için MoviesController sınıfında veya Create.cshtml görünümünde tek bir kod satırını değiştirmeniz gerekmemesidir. Bu öğreticide daha önce oluşturduğunuz denetleyici ve görünümler, model sınıfının özelliklerinde Movie doğrulama özniteliklerini kullanarak belirttiğiniz doğrulama kurallarını otomatik olarak aldı. Test doğrulamasını Edit eylem metodunu kullanarak gerçekleştirin ve aynı doğrulama uygulanır.
İstemci tarafı doğrulama hataları olmadan form verileri sunucuya gönderilmez.
HTTP Post yöntemine bir durma noktası koyarak, Fiddler aracı veya F12 Geliştirici araçlarını kullanarak bunu doğrulayabilirsiniz.
Doğrulama nasıl çalışır?
Denetleyicideki veya görünümlerdeki kodda herhangi bir güncelleştirme olmadan doğrulama kullanıcı arabiriminin nasıl oluşturulduğunu merak edebilirsiniz. Aşağıdaki kod iki Create yöntemi gösterir.
// GET: Movies/Create
public IActionResult Create()
{
return View();
}
// POST: Movies/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(
[Bind("ID,Title,ReleaseDate,Genre,Price, Rating")] Movie movie)
{
if (ModelState.IsValid)
{
_context.Add(movie);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(movie);
}
İlk (HTTP GET) Create eylem yöntemi ilk Oluşturma formunu görüntüler. İkinci ([HttpPost]) sürüm, form gönderisini işler. İkinci Create yöntem ( [HttpPost] Sürüm), filmin herhangi bir doğrulama hatası olup olmadığını denetlemek için çağırır ModelState.IsValid . Bu yöntemin çağrılması, nesneye uygulanmış olan tüm doğrulama özniteliklerini değerlendirir. Nesnede doğrulama hataları varsa, Create yöntemi formu yeniden görüntüler. Hata yoksa yöntemi yeni filmi veritabanına kaydeder. Film örneğimizde, istemci tarafında doğrulama hataları algılandığında form sunucuya gönderilmez; İstemci tarafı doğrulama hataları olduğunda ikinci Create yöntem hiçbir zaman çağrılmaz. Tarayıcınızda JavaScript'i devre dışı bırakırsanız istemci doğrulaması devre dışı bırakılır ve doğrulama hatalarını algılayan HTTP POST Create yöntemini ModelState.IsValid test edebilirsiniz.
yönteminde bir kesme noktası ayarlayabilir ve yöntemin [HttpPost] Create hiçbir zaman çağrılmadığını doğrulayabilirsiniz; doğrulama hataları algılandığında istemci tarafı doğrulaması form verilerini göndermez. Tarayıcınızın JavaScript'i devre dışı bırakırsanız ve oluşan hatalarla formu gönderirseniz, kesme noktası görülür. JavaScript olmadan da tam doğrulama elde edersiniz.
Aşağıdaki görüntüde Firefox tarayıcısında JavaScript'i devre dışı bırakma gösterilmektedir.
Aşağıdaki görüntüde, Chrome tarayıcısında JavaScript'in nasıl devre dışı bırakılası gösterilmektedir.
JavaScript'i devre dışı bırakdıktan sonra geçersiz veri gönderin ve hata ayıklayıcıda adım adım ilerleyin.
Görünüm şablonunun Create.cshtml bölümü aşağıdaki işaretlemede gösterilir:
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
@*Markup removed for brevity.*@
Önceki işaretleme, eylem yöntemleri tarafından ilk formu görüntülemek ve bir hata durumunda yeniden görüntülemek için kullanılır.
Giriş Etiketi Yardımcısı DataAnnotations özniteliklerini kullanır ve istemci tarafında jQuery Doğrulaması için gereken HTML özniteliklerini üretir. Doğrulama Etiketi Yardımcısı doğrulama hatalarını görüntüler. Daha fazla bilgi için bkz . Doğrulama .
Bu yaklaşımın hoş yanı, denetleyici veya görünüm şablonunun uygulanan gerçek doğrulama kuralları veya görüntülenen belirli hata iletileri hakkında hiçbir şey bilmemesidir. Doğrulama kuralları ve hata dizeleri yalnızca sınıfında Movie belirtilir. Bu aynı doğrulama kuralları, Edit görünümüne ve modelinizi düzenleyen başka herhangi bir görünüm şablonuna otomatik olarak uygulanır.
Doğrulama mantığını değiştirmeniz gerektiğinde, modele doğrulama öznitelikleri ekleyerek (bu örnekte Movie sınıfı) bunu tam olarak tek bir yerde yapabilirsiniz. Uygulamanın farklı bölümlerinin kuralların nasıl uygulandığıyla tutarsız olması konusunda endişelenmeniz gerekmez; tüm doğrulama mantığı tek bir yerde tanımlanır ve her yerde kullanılır. Bu, kodu çok temiz tutar ve bakımını ve gelişmesini kolaylaştırır. Bu da DRY prensibini tamamen uygulayacağınız anlamına geliyor.
DataType Özniteliklerini Kullanma
Movie.cs dosyasını açın ve Movie sınıfını inceleyin. Namespace, System.ComponentModel.DataAnnotations yerleşik doğrulama öznitelikleri kümesine ek olarak biçimlendirme öznitelikleri sağlar. Yayın tarihine ve fiyat alanlarına zaten bir DataType numaralandırma değeri uyguladık. Aşağıdaki kod, ReleaseDate ve Price özelliklerini uygun DataType özniteliği ile gösterir.
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Range(1, 100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }
DataType Öznitelikler yalnızca görünüm motorunun verileri biçimlendirmesi için ipuçları sağlar ve URL'ler için <a> ve e-posta için <a href="mailto:EmailAddress.com"> gibi öznitelikler sağlar. Veri biçimini doğrulamak için özniteliğini kullanabilirsiniz RegularExpression .
DataType özniteliği, veritabanı iç türünden daha özel bir veri türü belirtmek için kullanılır; bunlar doğrulama öznitelikleri değildir. Bu durumda yalnızca tarihi takip etmek istiyoruz, saati değil. Numaralandırma Tarih DataType , Saat, Telefon Numarası, Para Birimi, EmailAddress ve daha fazlası gibi birçok veri türünü sağlar. Özniteliği, DataType uygulamanın türe özgü özellikleri otomatik olarak sağlamasına da olanak sağlayabilir. Örneğin, bir mailto: bağlantısı oluşturulabilir ve HTML5'i destekleyen tarayıcılarda DataType.EmailAddress için bir tarih seçici sağlanabilir. Öznitelikler, DataType HTML 5 data- tarayıcılarının anlayabileceği HTML 5 (belirgin veri tiresi) öznitelikleri yayar.
DataType Öznitelikler herhangi bir doğrulama sağlamaz.
DataType.Date görüntülenen tarihin biçimini belirtmez. Varsayılan olarak, veri alanı sunucunun CultureInfoöğesine göre varsayılan biçimlere göre görüntülenir.
DisplayFormat özniteliği, tarih biçimini açıkça belirtmek için kullanılır:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
ayarı, ApplyFormatInEditMode değer düzenleme için bir metin kutusunda görüntülendiğinde biçimlendirmenin de uygulanması gerektiğini belirtir. (Bazı alanlarda bunu istemeyebilirsiniz; örneğin, para birimi değerleri için, büyük olasılıkla metin kutusunda para birimi simgesinin düzenlenmesini istemezsiniz.)
özniteliğini DisplayFormat tek başına kullanabilirsiniz, ancak özniteliğini DataType kullanmak genellikle iyi bir fikirdir.
DataType özniteliği, verilerin ekranda nasıl işleneceğinin aksine semantiğini iletir ve DisplayFormat ile elde etmediğiniz aşağıdaki avantajları sağlar:
Tarayıcı HTML5 özelliklerini etkinleştirebilir (örneğin, bir takvim denetimi, yerel ayara uygun para birimi simgesi, e-posta bağlantıları vb.)
Varsayılan olarak, tarayıcı yerel ayarınıza göre doğru biçimi kullanarak verileri işler.
DataTypeözniteliği, MVC'nin verileri işlemek için doğru alan şablonunu seçmesini sağlayabilir (DisplayFormatkendisi tarafından kullanılıyorsa, dize şablonunu kullanır).
Not
jQuery doğrulaması Range özniteliği ve DateTime ile çalışmaz. Örneğin, tarih belirtilen aralıkta olsa bile aşağıdaki kod her zaman bir istemci tarafı doğrulama hatası görüntüler:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Range ve DateTime ile özniteliğini kullanmak için jQuery tarih doğrulamasını devre dışı bırakmanız gerekir. Modellerinizde sabit tarihleri derlemek genellikle iyi bir uygulama değildir, bu nedenle özniteliğini Range kullanmak ve DateTime önerilmez.
Aşağıdaki kod öznitelikleri tek satırda birleştirmeyi gösterir:
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
public string Title { get; set; }
[Display(Name = "Release Date"), DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$"), Required, StringLength(30)]
public string Genre { get; set; }
[Range(1, 100), DataType(DataType.Currency)]
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$"), StringLength(5)]
public string Rating { get; set; }
}
Serinin bir sonraki bölümünde uygulamayı gözden geçirecek ve otomatik olarak oluşturulan Details ve Delete yöntemlerinde bazı iyileştirmeler yapacağız.
İlgili içerik
ASP.NET Core