Doğrulama Ekleme

tarafından Rick Anderson

Not

Visual Studio'nun en son sürümünü kullanarak bu öğreticinin güncelleştirilmiş bir sürümüne buradan ulaşabilirsiniz. Yeni öğreticide, bu öğreticide birçok geliştirme sağlayan ASP.NET Core MVC kullanılır.

Bu öğreticide, denetleyiciler ve görünümlerle ASP.NET Core MVC öğretildi. Razor Pages, web kullanıcı arabirimi oluşturmayı daha kolay ve daha üretken hale getiren sayfa tabanlı bir programlama modeli olan ASP.NET Core'de yeni bir alternatiftir. Razor Pages öğreticisini MVC sürümünden önce denemenizi öneririz. Razor Pages öğreticisi:

  • Takip etmek daha kolaydır.
  • Daha fazla özelliği kapsar.
  • Yeni uygulama geliştirme için tercih edilen yaklaşımdır.

Bu bölümde modele Movie doğrulama mantığı ekleyeceksiniz ve kullanıcı uygulamayı kullanarak film oluşturmaya veya düzenlemeye çalıştığında doğrulama kurallarının uygulanmasını sağlayacaksınız.

Öğeleri KURU Tutma

ASP.NET MVC'nin temel tasarım kümelerinden biri DRY 'dur ("Kendinizi Tekrar etmeyin"). ASP.NET MVC, işlevselliği veya davranışı yalnızca bir kez belirtmenizi ve ardından uygulamanın her yerine yansıtılmanızı teşvik eder. Bu, yazmanız gereken kod miktarını azaltır ve yazdığınız kodun daha az hataya eğilimli olmasını ve korunmasını kolaylaştırır.

ASP.NET MVC ve Entity Framework Code First tarafından sağlanan doğrulama desteği, DRY ilkesinin nasıl çalıştığının harika bir örneğidir. Doğrulama kurallarını tek bir yerde (model sınıfında) bildirimli olarak belirtebilirsiniz ve kurallar uygulamanın her yerinde zorlanır.

Şimdi film uygulamasında bu doğrulama desteğinden nasıl yararlanabileceğinize bakalım.

Film Modeline Doğrulama Kuralları Ekleme

Sınıfına doğrulama mantığı Movie ekleyerek başlayacaksınız.

Movie.cs dosyasını açın. Ad alanının System.ComponentModel.DataAnnotations içermediğini System.Webfark edin. DataAnnotations, herhangi bir sınıfa veya özelliğe bildirim temelli olarak uygulayabileceğiniz yerleşik bir doğrulama öznitelikleri kümesi sağlar. (Ayrıca, biçimlendirmeye yardımcı olan ve doğrulama sağlamayan DataType gibi biçimlendirme öznitelikleri de içerir.)

Şimdi yerleşik , , StringLengthRegularExpression ve Range doğrulama özniteliklerinden Requiredyararlanmak için sınıfını güncelleştirinMovie. sınıfını Movie aşağıdakilerle değiştirin:

public class Movie
{
    public int ID { get; set; }

    [StringLength(60, MinimumLength = 3)]
    public string Title { get; set; }

    [Display(Name = "Release Date")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime ReleaseDate { get; set; }
  
    [RegularExpression(@"^[A-Z]+[a-zA-Z]*$")]
    [Required]
    [StringLength(30)]
    public string Genre { get; set; }

    [Range(1, 100)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z]*$")]
    [StringLength(5)]
    public string Rating { get; set; }
}

StringLength özniteliği dizenin uzunluk üst sınırını ayarlar ve veritabanında bu sınırlamayı ayarlar, bu nedenle veritabanı şeması değişir. Sunucu gezginindeFilmler tablosuna sağ tıklayın ve Tablo Tanımını Aç'a tıklayın:

Sunucu Gezgini penceresinin açık ve d b o noktaLı Filmler Tasarımı sekmesinde olduğunu gösteren ekran görüntüsü.

Yukarıdaki resimde tüm dize alanlarının NVARCHAR (MAX) olarak ayarlandığını görebilirsiniz. Şemayı güncelleştirmek için geçişleri kullanacağız. Çözümü derleyip Paket Yöneticisi Konsolu penceresini açın ve aşağıdaki komutları girin:

add-migration DataAnnotations
update-database

Bu komut tamamlandığında, Visual Studio belirtilenDataAnnotations () adlı yeni DbMigration türetilmiş sınıfı tanımlayan sınıf dosyasını açar ve yönteminde Up şema kısıtlamalarını güncelleştiren kodu görebilirsiniz:

public override void Up()
{
    AlterColumn("dbo.Movies", "Title", c => c.String(maxLength: 60));
    AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false, maxLength: 30));
    AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5));
}

Alan Genre artık null atanamaz (başka bir ifadeyle bir değer girmeniz gerekir). Alanın Rating uzunluğu en fazla 5 ve Title uzunluğu en fazla 60'tır. Üzerinde en az 3 Title uzunluğu ve üzerindeki Price aralık şema değişiklikleri oluşturmadı.

Film şemasını inceleyin:

Film Tasarımı sekmesini gösteren ekran görüntüsü. Başlık ve Derecelendirme Null Değerlere İzin Ver sütununda denetleniyor.

Dize alanları yeni uzunluk sınırlarını gösterir ve Genre artık null atanabilir olarak işaretlenmez.

Doğrulama öznitelikleri, uygulandıkları model özelliklerinde zorlamak istediğiniz davranışı belirtir. Required ve MinimumLength öznitelikleri, bir özelliğin bir değere sahip olması gerektiğini gösterir, ancak hiçbir şey kullanıcının bu doğrulamayı karşılamak için boşluk girmesini engellemez. Hangi karakterlerin giriş olabileceğini sınırlamak için RegularExpression özniteliği kullanılır. Yukarıdaki Genre kodda ve Rating yalnızca harf kullanmalıdır (boşluk, sayı ve özel karakterlere izin verilmez). 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 (örneğin decimal, int, float, DateTime) doğası gereği gereklidir ve özniteliği gerekmez Required .

Code First, bir model sınıfında belirttiğiniz doğrulama kurallarının uygulama değişiklikleri veritabanına kaydetmeden önce uygulanmasını sağlar. Örneğin, aşağıdaki kod yöntem çağrıldığında SaveChanges bir DbEntityValidationException özel durumu oluşturur çünkü gerekli Movie birkaç özellik değeri eksiktir:

MovieDBContext db = new MovieDBContext();
Movie movie = new Movie();
movie.Title = "Gone with the Wind";
db.Movies.Add(movie);
db.SaveChanges();        // <= Will throw server side validation exception

Yukarıdaki kod aşağıdaki özel durumu oluşturur:

Bir veya daha fazla varlık için doğrulama başarısız oldu. Daha fazla ayrıntı için bkz. 'EntityValidationErrors' özelliği.

doğrulama kurallarının .NET Framework tarafından otomatik olarak zorlanması, 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 girmesine izin vermenizi sağlar.

ASP.NET MVC'de Doğrulama Hatası Kullanıcı Arabirimi

Uygulamayı çalıştırın ve /Movies URL'sine gidin.

Yeni film eklemek için Yeni Oluştur bağlantısına tıklayın. Formu bazı geçersiz değerlerle doldurun. jQuery istemci tarafı doğrulaması hatayı algılar algılamaz bir hata iletisi görüntüler.

8_validationErrors

Not

Ondalık ayırıcı için virgül (",") kullanan İngilizce olmayan yerel ayarlarda jQuery doğrulamasını desteklemek için, bu öğreticide daha önce açıklandığı gibi NuGet genelleştirmesini eklemeniz gerekir.

Formun geçersiz veri içeren metin kutularını vurgulamak için otomatik olarak kırmızı kenarlık rengi kullandığına ve her birinin yanına uygun bir doğrulama hata iletisi yaydığını fark edin. Hatalar hem istemci tarafı (JavaScript ve jQuery kullanılarak) hem de sunucu tarafı (kullanıcının JavaScript'in devre dışı bırakılması durumunda) zorlanır.

Gerçek bir avantaj, bu doğrulama kullanıcı arabirimini etkinleştirmek için sınıfta veya Create.cshtml görünümünde tek bir kod MoviesController satırını değiştirmeniz gerekmesidir. 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ı. Eylem yöntemini kullanarak doğrulamayı Edit test edin ve aynı doğrulama uygulanır.

form verileri, istemci tarafı doğrulama hatası olmadan sunucuya gönderilmez. Http Post yöntemine bir kesme noktası koyarak, fiddler aracını veya IE F12 geliştirici araçlarını kullanarak bunu doğrulayabilirsiniz.

Oluşturma Görünümü ve Oluşturma Eylem Yönteminde Doğrulama Nasıl Gerçekleşir?

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. Sonraki listede sınıftaki yöntemlerin CreateMovieController nasıl göründüğü gösterilir. Bunlar, bu öğreticinin önceki bölümlerinde oluşturduğunuz şekilde değiştirilmez.

public ActionResult Create()
{
    return View();
}
// POST: /Movies/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
    if (ModelState.IsValid)
    {
        db.Movies.Add(movie);
        db.SaveChanges();
        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 doğrulama hataları olup olmadığını denetler ModelState.IsValid . Bu özelliği almak, nesneye uygulanmış olan tüm doğrulama özniteliklerini değerlendirir. Nesnede doğrulama hataları varsa, Create yöntemi formu yeniden gösterir. 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; ikinciCreateyöntem hiçbir zaman çağrılmıyor. Tarayıcınızda JavaScript'i devre dışı bırakırsanız istemci doğrulaması devre dışı bırakılır ve HTTP POST Create yöntemi ModelState.IsValid , filmin herhangi bir doğrulama hatası olup olmadığını denetler.

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ğrulama form verilerini göndermez. Tarayıcınızda JavaScript'i devre dışı bırakır ve ardından formu hatalarla gönderirseniz kesme noktasına isabet eder. JavaScript olmadan da tam doğrulama elde edersiniz. Aşağıdaki görüntüde, Internet Explorer'da JavaScript'in nasıl devre dışı bırakılası gösterilmektedir.

İnternet Seçenekleri penceresinin açık ve güvenlik sekmesinde olduğunu gösteren ekran görüntüsü. Özel düzey penceresi açık ve Etkin betik devre dışı bırakıldı.

H t p gönderisini ve Model durumu noktanın geçerli olup olmadığını gösteren ekran görüntüsü vurgulanmış.

Aşağıdaki görüntüde FireFox tarayıcısında JavaScript'in nasıl devre dışı bırakılası gösterilmektedir.

Seçenekler penceresini gösteren ekran görüntüsü. İçerik seçilir ve Java Betiğini Etkinleştir kırmızıyla daire içine alınıyor.

Aşağıdaki görüntüde, Chrome tarayıcısında JavaScript'in nasıl devre dışı bırakılası gösterilmektedir.

Java Betiği ayarını ve izin verme veya devre dışı bırakma seçeneğini gösteren ekran görüntüsü.

Aşağıda, öğreticinin önceki bölümlerinde iskelesini oluşturduğunuz Create.cshtml görünüm şablonu yer almaktadır. Hem ilk formu görüntülemek hem de hata durumunda yeniden görüntülemek için yukarıda gösterilen eylem yöntemleri tarafından kullanılır.

@model MvcMovie.Models.Movie
@{
    ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()    
    <div class="form-horizontal">
        <h4>Movie</h4>
        <hr />
        @Html.ValidationSummary(true)
        <div class="form-group">
            @Html.LabelFor(model => model.Title, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Title)
                @Html.ValidationMessageFor(model => model.Title)
            </div>
        </div>
        @*Fields removed for brevity.*@        




        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Kodun her Movie özelliğin öğesini çıkarmak için nasıl bir Html.EditorFor yardımcı kullandığına <input> dikkat edin. Bu yardımcının yanında yardımcı yöntemine yapılan Html.ValidationMessageFor bir çağrı bulunur. Bu iki yardımcı yöntem, denetleyici tarafından görünüme geçirilen model nesnesiyle (bu örnekte bir Movie nesne) çalışır. Modelde belirtilen doğrulama özniteliklerini otomatik olarak arar ve hata iletilerini uygun şekilde görüntüler.

Bu yaklaşımda gerçekten iyi olan şey, denetleyicinin veya görünüm şablonunun Create , uygulanan gerçek doğrulama kuralları veya görüntülenen belirli hata iletileri hakkında hiçbir şey bilmediğidir. Doğrulama kuralları ve hata dizeleri yalnızca sınıfında Movie belirtilir. Bu doğrulama kuralları görünüme Edit ve modelinizi düzenleyen oluşturabileceğiniz diğer görünüm şablonlarına otomatik olarak uygulanır.

Doğrulama mantığını daha sonra değiştirmek isterseniz, 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 ilkesini tamamen onurlandıracağın anlamına geliyor.

DataType Özniteliklerini Kullanma

Movie.cs dosyasını açın ve sınıfını Movie inceleyin. Ad System.ComponentModel.DataAnnotations alanı, 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 uygun DataType özniteliğine sahip ve Price özelliklerini gösterir.

[DataType(DataType.Date)] 
public DateTime ReleaseDate { get; set; }
       
[DataType(DataType.Currency)] 
public decimal Price { get; set; }

DataType öznitelikleri yalnızca görünüm altyapısının verileri biçimlendirmesi için ipuçları sağlar (ve URL'ler ve <a href="mailto:EmailAddress.com"> e-posta için gibi <a> öznitelikler sağlar. Verilerin biçimini doğrulamak için RegularExpression özniteliğini kullanabilirsiniz. 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 izlemek istiyoruz, tarih ve saati izlemek istemiyoruz. DataType NumaralandırmasıDate, Time, PhoneNumber, Currency, EmailAddress ve daha fazlası gibi birçok veri türü sağlar. özniteliği, DataType uygulamanın türe özgü özellikleri otomatik olarak sağlamasına da olanak tanıyabilir. Örneğin, DataType.EmailAddress için bir mailto: bağlantı oluşturulabilir ve HTML5'i destekleyen tarayıcılarda DataType.Date için bir tarih seçici sağlanabilir. DataType öznitelikleri, HTML 5 tarayıcılarının anlayabileceği HTML 5 veri- (belirgin veri tiresi) öznitelikleri yayar. DataType öznitelikleri herhangi bir doğrulama sağlamaz.

DataType.Date görüntülenen tarihin biçimini belirtmez. Varsayılan olarak, veri alanı sunucunun CultureInfo'sunu temel alan 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 EnrollmentDate { get; set; }

ayarı, ApplyFormatInEditMode değer düzenleme için bir metin kutusunda görüntülendiğinde belirtilen biçimlendirmenin de uygulanması gerektiğini belirtir. (Bazı alanlar için bunu istemeyebilirsiniz; örneğin, para birimi değerleri için, metin kutusunda para birimi simgesinin düzenlenmesini istemeyebilirsiniz.)

DisplayFormat özniteliğini tek başına kullanabilirsiniz, ancak DataType özniteliğini de kullanmak genellikle iyi bir fikirdir. DataType özniteliği, verilerin ekranda nasıl işlendiğinin aksine semantiğini iletir ve ile DisplayFormatelde 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 (kendisi tarafından kullanılıyorsa DisplayFormat dize şablonunu kullanır). Daha fazla bilgi için bkz. Brad Wilson'ın ASP.NET MVC 2 Şablonları. (MVC 2 için yazılmış olsa da, bu makale ASP.NET MVC'nin geçerli sürümü için hala geçerlidir.)

özniteliğini DataType bir tarih alanıyla kullanırsanız, alanın Chrome tarayıcılarında doğru şekilde işlenmesini sağlamak için özniteliğini de belirtmeniz DisplayFormat gerekir. Daha fazla bilgi için bu StackOverflow iş parçacığına bakın.

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 özniteliğini DateTime ile 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 Range özniteliğini ve DateTime'ı kullanmak önerilmez.

Aşağıdaki kod, öznitelikleri tek satırda birleştirmeyi gösterir:

public class Movie
{
   public int ID { get; set; }
   [Required,StringLength(60, MinimumLength = 3)]
   public string Title { get; set; }
   [Display(Name = "Release Date"),DataType(DataType.Date)]
   public DateTime ReleaseDate { get; set; }
   [Required]
   public string Genre { get; set; }
   [Range(1, 100),DataType(DataType.Currency)]
   public decimal Price { get; set; }
   [Required,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.