第 6 部分:使用資料註解進行模型驗證

作者 :JonGaloway

MVC 音樂市集是一個教學課程應用程式,會介紹並說明如何使用 ASP.NET MVC 和 Visual Studio 進行 Web 開發。

MVC 音樂市集是輕量型的市集實作,可線上銷售音樂相簿,並實作基本網站管理、使用者登入和購物車功能。

本教學課程系列詳細說明建置 ASP.NET MVC 音樂市集範例應用程式所採取的所有步驟。 第 6 部分涵蓋使用資料批註進行模型驗證。

我們的建立和編輯表單有重大問題:它們不會進行任何驗證。 我們可以執行一些動作,例如在 [價格] 欄位中保留必要的欄位空白或輸入字母,而我們會看到的第一個錯誤是來自資料庫。

我們可以藉由將資料批註新增至模型類別,輕鬆地將驗證新增至應用程式。 資料批註可讓我們描述我們想要套用至模型屬性的規則,ASP.NET MVC 會負責強制執行這些規則,並向使用者顯示適當的訊息。

將驗證新增至我們的相簿表單

我們將使用下列資料批註屬性:

  • 必要 – 指出屬性是必要欄位
  • DisplayName – 定義要用於表單欄位和驗證訊息的文字
  • StringLength – 定義字串欄位的最大長度
  • 範圍 – 提供數值欄位的最大值和最小值
  • 系結 – 列出將參數或表單值系結至模型屬性時要排除或包含的欄位
  • ScaffoldColumn – 允許隱藏編輯器表單中的欄位

*注意:如需使用資料批註屬性進行模型驗證的詳細資訊,請參閱 MSDN 檔,網址為 *https://go.microsoft.com/fwlink/?LinkId=159063

開啟 Album 類別,並將下列 using 語句新增至頂端。

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

接下來,更新屬性以新增顯示和驗證屬性,如下所示。

namespace MvcMusicStore.Models
{
    [Bind(Exclude = "AlbumId")]
    public class Album
    {
        [ScaffoldColumn(false)]
        public int      AlbumId    { get; set; }
        [DisplayName("Genre")]
        public int      GenreId    { get; set; }
        [DisplayName("Artist")]
        public int      ArtistId   { get; set; }
        [Required(ErrorMessage = "An Album Title is required")]
        [StringLength(160)]
        public string   Title      { get; set; }
        [Range(0.01, 100.00,
            ErrorMessage = "Price must be between 0.01 and 100.00")]
        public decimal Price       { get; set; }
        [DisplayName("Album Art URL")]
        [StringLength(1024)]
        public string AlbumArtUrl { get; set; }
        public virtual Genre  Genre    { get; set; }
        public virtual Artist Artist   { get; set; }
    }
}

我們在該處時,也已將內容類型和藝術師變更為虛擬屬性。 這可讓 Entity Framework 視需要延遲載入它們。

public virtual Genre    Genre       { get; set; }
public virtual Artist   Artist      { get; set; }

將這些屬性新增至 [相簿] 模型之後,我們的 [建立和編輯] 畫面會立即開始驗證欄位,並使用我們選擇的 [顯示名稱] (例如[相簿藝術師 URL],而不是 [相簿藝術師 Url]) 。 執行應用程式並流覽至 /StoreManager/Create。

[建立] 表單的螢幕擷取畫面,其中顯示 [內容類型] 和 [藝術師] 下拉式清單,以及 [標題]、[價格] 和 [相簿藝術師 U R L] 欄位。

接下來,我們將中斷一些驗證規則。 輸入 0 的價格,並將 [標題] 保留空白。 當我們按一下 [建立] 按鈕時,會看到顯示驗證錯誤訊息的表單,其中顯示哪些欄位不符合我們定義的驗證規則。

[建立] 表單的螢幕擷取畫面,其中顯示紅色的 [標題] 和 [價格] 欄位,因為輸入錯誤和隨附紅色錯誤。

測試Client-Side驗證

伺服器端驗證從應用程式的觀點來看非常重要,因為使用者可以規避用戶端驗證。 不過,只實作伺服器端驗證的網頁表單會顯示三個重要的問題。

  1. 使用者必須等候在伺服器上張貼、驗證表單,以及將回應傳送至其瀏覽器。
  2. 使用者在更正欄位時不會立即收到意見反應,因此現在會通過驗證規則。
  3. 我們正在浪費伺服器資源來執行驗證邏輯,而不是利用使用者的瀏覽器。

幸運的是,ASP.NET MVC 3 Scaffold 範本內建了用戶端驗證,不需要額外的工作。

在 [標題] 欄位中輸入單一字母符合驗證需求,因此會立即移除驗證訊息。

[建立] 表單的螢幕擷取畫面,其中顯示紅色的 [價格] 欄位,因為輸入中有錯誤,並隨附紅色錯誤文字。