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 sağlanır. 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 zorunlu kılındığından emin olacaksı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ı sağlar. Bu, yazmanız gereken kod miktarını azaltır ve yazdığınız kodun korunması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ı bildirimli olarak tek bir yerde (model sınıfında) 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'ün 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 belirtir; bu örnekte, bir filmin geçerli olması için Title, ReleaseDate, Genreve Price özellikleri için değ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 sağlam 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.

Güncelleştirilmiş Movie.cs dosyası için tam bir 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 bir 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ığına dikkat edin. 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'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ı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 liste, sınıftaki yöntemlerin Create MovieController nasıl göründüğünü gösterir. 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şturma formunu görüntüler. İkincisi, form gönderisini işler. İkinci Create yöntem, 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ö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 öğesinin çıktısını almak 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 hoş 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 bir şey bilmesi değildir. 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 prensibini tamamen yerine getiren bir şey olacağı anlamına geliyor.

Film Modeline Biçimlendirme Ekleme

Movie.cs dosyasını açın. Ad alanı, System.ComponentModel.DataAnnotations yerleşik doğrulama öznitelikleri kümesine ek olarak biçimlendirme öznitelikleri sağlar. Özniteliğini DisplayFormat ve numaralandırma DataType değerini yayın tarihine ve fiyat alanlarına uygulayacaksınız. Aşağıdaki kod, ReleaseDate uygun DisplayFormat öznitelikle 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, bir tarih biçimi dizesi (yani "d") ile yayın tarihi özelliğini 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.