Aracılığıyla paylaş


Modele Doğrulama Ekleme (C#)

tarafından Rick Anderson

Not

Bu öğreticinin ASP.NET MVC 5 ve Visual Studio 2013 kullanan güncelleştirilmiş bir sürümü burada mevcuttur. Daha güvenlidir, takip etmek çok daha kolaydır ve daha fazla özellik gösterir.

Bu öğreticide, Microsoft Visual Studio'nun ücretsiz sürümü olan Microsoft Visual Web Developer 2010 Express Service Pack 1'i kullanarak ASP.NET MVC Web uygulaması oluşturmanın temelleri öğretilecektir. Başlamadan önce, aşağıda listelenen önkoşulları yüklediğinizden emin olun. Aşağıdaki bağlantıya tıklayarak bunların tümünü yükleyebilirsiniz: Web Platformu Yükleyicisi. Alternatif olarak, aşağıdaki bağlantıları kullanarak önkoşulları tek tek yükleyebilirsiniz:

Visual Web Developer 2010 yerine Visual Studio 2010 kullanıyorsanız, aşağıdaki bağlantıya tıklayarak önkoşulları yükleyin: Visual Studio 2010 önkoşulları.

C# kaynak koduna sahip bir Visual Web Developer projesi bu konuya eşlik edebilir. C# sürümünü indirin. Visual Basic'i tercih ediyorsanız bu öğreticinin Visual Basic sürümüne geçin.

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 bakımını çok daha kolay hale getirir.

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 ardından bu 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. Dosyanın en üstüne ad alanına başvuran System.ComponentModel.DataAnnotations bir using deyim ekleyin:

using System.ComponentModel.DataAnnotations;

Ad alanı .NET Framework bir parçasıdır. Herhangi bir sınıfa veya özelliğe bildirim temelli olarak uygulayabileceğiniz yerleşik bir doğrulama öznitelikleri kümesi sağlar.

Şimdi yerleşik Required, StringLengthve Range doğrulama özniteliklerinden yararlanmak için sınıfını güncelleştirinMovie. Özniteliklerin nereye uygulanacağını gösteren bir örnek olarak aşağıdaki kodu kullanın.

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

    [Required(ErrorMessage = "Title is required")]
    public string Title { get; set; }

    [Required(ErrorMessage = "Date is required")]
    public DateTime ReleaseDate { get; set; }

    [Required(ErrorMessage = "Genre must be specified")]
    public string Genre { get; set; }

    [Range(1, 100, ErrorMessage = "Price must be between $1 and $100")]
    public decimal Price { get; set; }

    [StringLength(5)]
    public string Rating { get; set; }
}

Doğrulama öznitelikleri, uygulandıkları model özelliklerinde zorlamak istediğiniz davranışı belirtir. Required özniteliği, bir özelliğin bir değere sahip olması gerektiğini gösterir; bu örnekte, bir filmin geçerli olması için , ReleaseDate, Genreve Price özellikleri için Titledeğerlere sahip olması gerekir. 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.

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 özel durum oluşturur, çünkü gerekli Movie birkaç özellik değeri eksiktir ve fiyat sıfırdır (geçerli aralığın dışındadır).

MovieDBContext db = new MovieDBContext();

Movie movie = new Movie();
movie.Title = "Gone with the Wind";
movie.Price = 0.0M;

db.Movies.Add(movie);
db.SaveChanges();        // <= Will throw validation exception

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.

Güncelleştirilmiş Movie.cs dosyası için tam kod listesi aşağıdadır:

using System;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace MvcMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }

        [Required(ErrorMessage = "Title is required")]
        public string Title { get; set; }

        public DateTime ReleaseDate { get; set; }

        [Required(ErrorMessage = "Genre must be specified")]
        public string Genre { get; set; }

        [Range(1, 100, ErrorMessage = "Price must be between $1 and $100")]
        public decimal Price { get; set; }

        [StringLength(5)]
        public string Rating { get; set; }
    }

    public class MovieDBContext : DbContext
    {
        public DbSet<Movie> Movies { get; set; }
    }
}

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

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

Yeni film eklemek için Film Oluştur bağlantısına tıklayın. Formu bazı geçersiz değerlerle doldurun ve oluştur düğmesine tıklayın.

8_validationErrors

Formun, geçersiz veri içeren metin kutularını vurgulamak için otomatik olarak bir arka plan rengi kullandığına ve her birinin yanına uygun bir doğrulama hata iletisi yaydığını unutmayın. Hata iletileri, sınıfa açıklama eklediğinizde belirttiğiniz hata dizeleriyle eşleşmektedir Movie . Hatalar hem istemci tarafı (JavaScript kullanılarak) hem de sunucu tarafı (kullanıcının JavaScript'i devre dışı bırakılmış olması 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ındaki Movie öznitelikleri kullanarak belirttiğiniz doğrulama kurallarını otomatik olarak aldı.

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.

//
// GET: /Movies/Create

public ActionResult Create()
{
    return View();
}

//
// POST: /Movies/Create

[HttpPost]
public ActionResult Create(Movie movie)
{
    if (ModelState.IsValid)
    {
        db.Movies.Add(movie);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(movie);
}

İlk eylem yöntemi ilk Oluştur formunu görüntüler. İkincisi form gönderisini işler. İkinci Create yöntem, filmin doğrulama hataları olup olmadığını denetlemek için çağrılar 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österir. Hata yoksa yöntemi yeni filmi veritabanına kaydeder.

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>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Movie</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.ReleaseDate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ReleaseDate)
            @Html.ValidationMessageFor(model => model.ReleaseDate)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Genre)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Genre)
            @Html.ValidationMessageFor(model => model.Genre)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Price)
            @Html.ValidationMessageFor(model => model.Price)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Rating)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Rating)
            @Html.ValidationMessageFor(model => model.Rating)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

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 oluştur şablonunun, 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.

Doğrulama mantığını daha sonra değiştirmek isterseniz, 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.

Film Modeline Biçimlendirme Ekleme

Movie.cs dosyasını açın. Ad System.ComponentModel.DataAnnotations alanı, yerleşik doğrulama öznitelikleri kümesine ek olarak biçimlendirme öznitelikleri sağlar. Özniteliğini DisplayFormat ve DataType numaralandırma değerini yayın tarihine ve fiyat alanlarına uygulayacaksınız. Aşağıdaki kod, ReleaseDate uygun DisplayFormat özniteliğine sahip ve Price özelliklerini gösterir.

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

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

Alternatif olarak, açıkça bir DataFormatString değer ayarlayabilirsiniz. Aşağıdaki kod, yayın tarihi özelliğini bir tarih biçimi dizesiyle (yani "d") gösterir. Bunu, yayın tarihinin bir parçası olarak zamanlamak istemediğinizi belirtmek için kullanırsınız.

[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime ReleaseDate { get; set; }

Aşağıdaki kod özelliği para birimi olarak biçimlendirmektedir Price .

[DisplayFormat(DataFormatString = "{0:c}")]
public decimal Price { get; set; }

Sınıfın tamamı Movie aşağıda gösterilmiştir.

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

    [Required(ErrorMessage = "Title is required")]
    public string Title { get; set; }

    [DisplayFormat(DataFormatString = "{0:d}")]
    public DateTime ReleaseDate { get; set; }

    [Required(ErrorMessage = "Genre must be specified")]
    public string Genre { get; set; }

    [Range(1, 100, ErrorMessage = "Price must be between $1 and $100")]
    [DisplayFormat(DataFormatString = "{0:c}")]
    public decimal Price { get; set; }

    [StringLength(5)]
    public string Rating { get; set; }
}

Uygulamayı çalıştırın ve denetleyiciye Movies göz atın.

8_format_SM

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.