Aracılığıyla paylaş


Modele Doğrulama Ekleme (VB)

tarafından Rick Anderson

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ı.

VB.NET kaynak koduna sahip bir Visual Web Geliştirici projesi bu konuya eşlik edebilir. VB.NET sürümünü indirin. C# dilini tercih ediyorsanız bu öğreticinin C# 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.vb dosyasını açın. Dosyanın en üstüne ad alanına başvuran System.ComponentModel.DataAnnotations bir Imports deyim ekleyin:

Imports 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 Property ID() As Integer

    <Required(ErrorMessage:="Title is required")>
    Public Property Title() As String

    <Required(ErrorMessage:="Date is required")>
    Public Property ReleaseDate() As Date

    <Required(ErrorMessage:="Genre must be specified")>
    Public Property Genre() As String

    <Required(ErrorMessage:="Price Required"), Range(1, 100, ErrorMessage:="Price must be between $1 and $100")>
    Public Property Price() As Decimal

    <StringLength(5)>
    Public Property Rating() As String
End Class

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).

Dim db As New MovieDBContext()

Dim movie As New Movie()
movie.Title = "Gone with the Wind"
movie.Price = 0.0D

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.vb dosyası için tam bir kod listesi aşağıdadır:

Imports System.Data.Entity
Imports System.ComponentModel.DataAnnotations

Public Class Movie
    Public Property ID() As Integer

    <Required(ErrorMessage:="Title is required")>
    Public Property Title() As String

    <Required(ErrorMessage:="Date is required")>
    Public Property ReleaseDate() As Date

    <Required(ErrorMessage:="Genre must be specified")>
    Public Property Genre() As String

    <Required(ErrorMessage:="Price Required"), Range(1, 100, ErrorMessage:="Price must be between $1 and $100")>
    Public Property Price() As Decimal

    <StringLength(5)>
    Public Property Rating() As String
End Class

Public Class MovieDBContext
    Inherits DbContext
    Public Property Movies() As DbSet(Of Movie)
End Class

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.vbhtml 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

Function Create() As ViewResult
    Return View()
End Function

'
' POST: /Movies/Create

<HttpPost()>
Function Create(movie As Movie) As ActionResult
    If ModelState.IsValid Then
        db.Movies.Add(movie)
        db.SaveChanges()
        Return RedirectToAction("Index")
    End If

    Return View(movie)
End Function

İ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.vbhtml 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.

@ModelType MvcMovie.Movie

@Code
    ViewData("Title") = "Create"
End Code

<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(Function(model) model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.Title)
            @Html.ValidationMessageFor(Function(model) model.Title)
        </div>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.ReleaseDate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.ReleaseDate)
            @Html.ValidationMessageFor(Function(model) model.ReleaseDate)
        </div>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.Genre)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.Genre)
            @Html.ValidationMessageFor(Function(model) model.Genre)
        </div>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.Price)
            @Html.ValidationMessageFor(Function(model) model.Price)
        </div>

 <div class="editor-label">
     @Html.LabelFor(Function(model) model.Rating)
 </div>
 <div class="editor-field">
     @Html.EditorFor(Function(model) model.Rating)
     @Html.ValidationMessageFor(Function(model) model.Rating)
 </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
End Using

<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.vb 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 Property ReleaseDate() As Date

     <DataType(DataType.Currency)>
    Public Property Price() As Decimal

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 Property ReleaseDate() As Date

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

<DisplayFormat(DataFormatString:="{0:c}")>
    Public Property Price() As Decimal

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

Public Class Movie
    Public Property ID() As Integer

    <Required(ErrorMessage:="Title is required")>
    Public Property Title() As String

    <Required(ErrorMessage:="Date is required")>
    <DataType(DataType.Date)>
    Public Property ReleaseDate() As Date

    <Required(ErrorMessage:="Genre must be specified")>
    Public Property Genre() As String

    <Required(ErrorMessage:="Price Required"), Range(1, 100, ErrorMessage:="Price must be between $1 and $100")>
    <DataType(DataType.Currency)>
    Public Property Price() As Decimal

    <StringLength(5)>
    Public Property Rating() As String
End Class

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

8_format_SM

Serinin 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..