第 6 部:モデル検証にデータ注釈を使用する

作成者: Jon Galloway

MVC ミュージック ストアは、WEB 開発に MVC と Visual Studio ASP.NET 使用する方法を段階的に紹介し、説明するチュートリアル アプリケーションです。

MVC ミュージック ストアは、オンラインで音楽アルバムを販売し、基本的なサイト管理、ユーザー サインイン、ショッピング カート機能を実装する軽量のサンプル ストア実装です。

このチュートリアル シリーズでは、ASP.NET MVC Music Store サンプル アプリケーションをビルドするために実行されるすべての手順について詳しく説明します。 パート 6 では、モデル検証にデータ注釈を使用する方法について説明します。

フォームの作成と編集には大きな問題があります。検証は行われません。 必須フィールドを空白のままにしたり、[価格] フィールドに文字を入力したりするなどの操作を行うことができます。最初に表示されるエラーはデータベースから発生します。

データ注釈をモデル クラスに追加することで、アプリケーションに検証を簡単に追加できます。 データ注釈を使用すると、モデル プロパティに適用するルールを記述でき、MVC ASP.NET はそれらを適用し、ユーザーに適切なメッセージを表示します。

アルバム フォームへの検証の追加

次のデータ注釈属性を使用します。

  • 必須 – プロパティが必須フィールドであることを示します
  • 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; }

これらの属性をアルバム モデルに追加すると、[作成と編集] 画面でフィールドの検証がすぐに開始され、選択した表示名 (AlbumArtUrl の代わりにアルバム アート URL など) が使用されます。 アプリケーションを実行し、/StoreManager/Create を参照します。

[ジャンル] ドロップダウンと [アーティスト] ドロップダウンと 、[タイトル]、[価格]、[アルバム アート][ U R L] フィールドを示す [作成] フォームのスクリーンショット。

次に、いくつかの検証規則を解除します。 価格 0 を入力し、[タイトル] を空白のままにします。 [作成] ボタンをクリックすると、定義した検証規則を満たしていないフィールドを示す検証エラー メッセージが表示されたフォームが表示されます。

入力エラーとそれに伴う赤いエラーが原因で、[タイトル] フィールドと [価格] フィールドが赤で表示されている [作成] フォームのスクリーンショット。

Client-Side検証のテスト

ユーザーはクライアント側の検証を回避できるため、サーバー側の検証はアプリケーションの観点から非常に重要です。 ただし、サーバー側の検証のみを実装する Web ページ フォームでは、3 つの重要な問題が発生します。

  1. ユーザーは、フォームが投稿され、サーバーで検証され、応答がブラウザーに送信されるのを待つ必要があります。
  2. ユーザーがフィールドを修正してもすぐにはフィードバックを受け取らないので、検証規則に合格します。
  3. ユーザーのブラウザーを利用する代わりに、検証ロジックを実行するためにサーバー リソースを無駄にしています。

幸いにも、ASP.NET MVC 3 スキャフォールディング テンプレートにはクライアント側の検証が組み込まれており、追加の作業は必要ありません。

[タイトル] フィールドに 1 文字を入力すると、検証要件が満たされるため、検証メッセージはすぐに削除されます。

入力エラーとそれに伴う赤いエラー テキストが原因で Price フィールドが赤で表示されている [作成] フォームのスクリーンショット。