Bagikan melalui


Menambahkan Validasi ke Model (VB)

oleh Rick Anderson

Tutorial ini akan mengajari Anda dasar-dasar membangun aplikasi Web MVC ASP.NET menggunakan Microsoft Visual Web Developer 2010 Express Service Pack 1, yang merupakan versi gratis dari Microsoft Visual Studio. Sebelum memulai, pastikan Anda telah menginstal prasyarat yang tercantum di bawah ini. Anda dapat menginstal semuanya dengan mengklik tautan berikut: Penginstal Platform Web. Atau, Anda dapat menginstal prasyarat secara individual menggunakan tautan berikut:

Jika Anda menggunakan Visual Studio 2010 alih-alih Visual Web Developer 2010, instal prasyarat dengan mengklik tautan berikut: Prasyarat Visual Studio 2010.

Proyek Visual Web Developer dengan kode sumber VB.NET tersedia untuk menyertai topik ini. Unduh versi VB.NET. Jika Anda lebih suka C#, beralihlah ke versi C# dari tutorial ini.

Di bagian ini Anda akan menambahkan logika validasi ke Movie model, dan Anda akan memastikan bahwa aturan validasi diberlakukan setiap kali pengguna mencoba membuat atau mengedit film menggunakan aplikasi.

Menjaga Hal-hal TETAP KERING

Salah satu tenet desain inti ASP.NET MVC adalah DRY ("Don't Repeat Yourself"). ASP.NET MVC mendorong Anda untuk menentukan fungsionalitas atau perilaku hanya sekali, dan kemudian membuatnya tercermin di mana-mana dalam aplikasi. Ini mengurangi jumlah kode yang perlu Anda tulis dan membuat kode yang Anda tulis jauh lebih mudah dipertahankan.

Dukungan validasi yang diberikan oleh ASP.NET MVC dan Entity Framework Code First adalah contoh yang bagus dari prinsip DRY yang sedang berjalan. Anda dapat secara deklaratif menentukan aturan validasi di satu tempat (di kelas model) dan kemudian aturan tersebut diberlakukan di mana-mana dalam aplikasi.

Mari kita lihat bagaimana Anda dapat memanfaatkan dukungan validasi ini di aplikasi film.

Menambahkan Aturan Validasi ke Model Film

Anda akan mulai dengan menambahkan beberapa logika validasi ke Movie kelas .

Buka file Movie.vb. Imports Tambahkan pernyataan di bagian atas file yang mereferensikan System.ComponentModel.DataAnnotations namespace:

Imports System.ComponentModel.DataAnnotations

Namespace adalah bagian dari .NET Framework. Ini menyediakan serangkaian atribut validasi bawaan yang dapat Anda terapkan secara deklaratif ke kelas atau properti apa pun.

Sekarang perbarui Movie kelas untuk memanfaatkan atribut validasi bawaan Required, StringLength, dan Range . Gunakan kode berikut sebagai contoh tempat menerapkan atribut.

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

Atribut validasi menentukan perilaku yang ingin Anda terapkan pada properti model yang diterapkan. Atribut Required menunjukkan bahwa properti harus memiliki nilai; dalam sampel ini, film harus memiliki nilai untuk Titleproperti , , ReleaseDateGenre, dan Price agar valid. Atribut Range membatasi nilai dalam rentang yang ditentukan. Atribut ini StringLength memungkinkan Anda mengatur panjang maksimum properti string, dan secara opsional panjang minimumnya.

Code First memastikan bahwa aturan validasi yang Anda tentukan pada kelas model diberlakukan sebelum aplikasi menyimpan perubahan dalam database. Misalnya, kode di bawah ini akan melemparkan pengecualian ketika metode dipanggil SaveChanges , karena beberapa nilai properti yang diperlukan Movie hilang dan harganya nol (yang berada di luar rentang yang valid).

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

Memiliki aturan validasi yang secara otomatis diberlakukan oleh .NET Framework membantu membuat aplikasi Anda lebih kuat. Ini juga memastikan bahwa Anda tidak bisa lupa untuk memvalidasi sesuatu dan secara tidak sengaja membiarkan data buruk ke dalam database.

Berikut adalah daftar kode lengkap untuk file Movie.vb yang diperbarui:

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

UI Kesalahan Validasi di MVC ASP.NET

Jalankan kembali aplikasi dan navigasikan ke URL /Movies .

Klik tautan Buat Film untuk menambahkan film baru. Isi formulir dengan beberapa nilai yang tidak valid lalu klik tombol Buat .

8_validationErrors

Perhatikan bagaimana formulir telah secara otomatis menggunakan warna latar belakang untuk menyoroti kotak teks yang berisi data yang tidak valid dan telah memancarkan pesan kesalahan validasi yang sesuai di samping masing-masing kotak teks. Pesan kesalahan cocok dengan string kesalahan yang Anda tentukan saat Anda membuat anotasi Movie kelas. Kesalahan diberlakukan sisi klien (menggunakan JavaScript) dan sisi server (jika pengguna menonaktifkan JavaScript).

Manfaat nyata adalah Anda tidak perlu mengubah satu baris kode di MoviesController kelas atau dalam tampilan Create.vbhtml untuk mengaktifkan UI validasi ini. Pengontrol dan tampilan yang Anda buat sebelumnya dalam tutorial ini secara otomatis mengambil aturan validasi yang Anda tentukan menggunakan atribut pada Movie kelas model.

Bagaimana Validasi Terjadi dalam Buat Tampilan dan Buat Metode Tindakan

Anda mungkin bertanya-tanya bagaimana UI validasi dihasilkan tanpa pembaruan kode di pengontrol atau tampilan. Daftar berikutnya menunjukkan seperti apa Create metode di MovieController kelas tersebut. Mereka tidak berubah dari cara Anda membuatnya sebelumnya dalam tutorial ini.

'
' 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

Metode tindakan pertama menampilkan formulir Buat awal. Yang kedua menangani posting formulir. Metode kedua Create memanggil ModelState.IsValid untuk memeriksa apakah film memiliki kesalahan validasi. Memanggil metode ini mengevaluasi atribut validasi apa pun yang telah diterapkan ke objek. Jika objek memiliki kesalahan validasi, Create metode akan memutar ulang formulir. Jika tidak ada kesalahan, metode menyimpan film baru dalam database.

Di bawah ini adalah templat tampilan Create.vbhtml yang Anda perancah sebelumnya dalam tutorial. Ini digunakan oleh metode tindakan yang ditunjukkan di atas untuk menampilkan formulir awal dan untuk memutarnya kembali jika terjadi kesalahan.

@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>

Perhatikan bagaimana kode menggunakan pembantu Html.EditorFor untuk menghasilkan <input> elemen untuk setiap Movie properti. Di samping pembantu ini adalah panggilan ke metode pembantu Html.ValidationMessageFor . Kedua metode pembantu ini bekerja dengan objek model yang diteruskan oleh pengontrol ke tampilan (dalam hal ini, objek Movie ). Mereka secara otomatis mencari atribut validasi yang ditentukan pada model dan menampilkan pesan kesalahan yang sesuai.

Apa yang benar-benar bagus tentang pendekatan ini adalah bahwa tidak ada pengontrol atau templat Buat tampilan yang tahu apa-apa tentang aturan validasi aktual yang diberlakukan atau tentang pesan kesalahan tertentu yang ditampilkan. Aturan validasi dan string kesalahan hanya ditentukan di Movie kelas .

Jika Anda ingin mengubah logika validasi nanti, Anda dapat melakukannya tepat di satu tempat. Anda tidak perlu khawatir tentang berbagai bagian aplikasi yang tidak konsisten dengan bagaimana aturan diberlakukan - semua logika validasi akan didefinisikan di satu tempat dan digunakan di mana-mana. Ini menjaga kode sangat bersih, dan membuatnya mudah untuk dipertahankan dan berkembang. Dan itu berarti bahwa Anda akan sepenuhnya menghormati prinsip DRY.

Menambahkan Pemformatan ke Model Film

Buka file Movie.vb. Namespace System.ComponentModel.DataAnnotations menyediakan atribut pemformatan selain kumpulan atribut validasi bawaan. Anda akan menerapkan DisplayFormat atribut dan DataType nilai enumerasi ke tanggal rilis dan ke bidang harga. Kode berikut menunjukkan ReleaseDate properti dan Price dengan atribut yang sesuai DisplayFormat .

<DataType(DataType.Date)>
    Public Property ReleaseDate() As Date

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

Atau, Anda dapat secara eksplisit menetapkan DataFormatString nilai. Kode berikut menunjukkan properti tanggal rilis dengan string format tanggal (yaitu, "d"). Anda akan menggunakan ini untuk menentukan bahwa Anda tidak ingin memiliki waktu sebagai bagian dari tanggal rilis.

<DisplayFormat(DataFormatString:="{0:d}")>
    Public Property ReleaseDate() As Date

Kode berikut memformat Price properti sebagai mata uang.

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

Kelas lengkap Movie ditunjukkan di bawah ini.

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

Jalankan aplikasi dan telusuri ke Movies pengontrol.

8_format_SM

Di bagian berikutnya dari seri ini, kita akan meninjau aplikasi dan melakukan beberapa penyempurnaan pada metode dan Delete yang dihasilkan Details secara otomatis.