データ検証注釈コントロールの検証 (C#)Validation with the Data Annotation Validators (C#)

マイクロソフトby Microsoft

データ注釈モデル バインダーを利用して、ASP.NET MVC アプリケーション内で検証を実行します。Take advantage of the Data Annotation Model Binder to perform validation within an ASP.NET MVC application. さまざまな種類の検証コントロール属性を使用し、Microsoft エンティティ フレームワークで使用する方法について説明します。Learn how to use the different types of validator attributes and work with them in the Microsoft Entity Framework.

このチュートリアルでは、データ注釈検証を使用して、ASP.NET MVC アプリケーションで検証を実行する方法について説明します。In this tutorial, you learn how to use the Data Annotation validators to perform validation in an ASP.NET MVC application. データ注釈検証コントロールを使用する利点は、クラス プロパティに 1 つ以上の属性 (Required 属性や StringLength 属性など) を追加するだけで、検証を実行できる点です。The advantage of using the Data Annotation validators is that they enable you to perform validation simply by adding one or more attributes – such as the Required or StringLength attribute – to a class property.

データ注釈検証コントロールを使用する前に、データ注釈モデル バインダーをダウンロードする必要があります。Before you can use the Data Annotation validators, you must download the Data Annotations Model Binder. CodePlexWeb サイトからデータ注釈モデル バインダーのサンプルをダウンロードするには、 ここをクリックしてください。You can download the Data Annotations Model Binder Sample from the CodePlex website by clicking here.

データ注釈モデル バインダーは Microsoft ASP.NET MVC フレームワークの公式部分ではないことを理解することが重要です。It is important to understand that the Data Annotations Model Binder is not an official part of the Microsoft ASP.NET MVC framework. データ注釈モデル バインダーは Microsoft ASP.NET MVC チームによって作成されましたが、Microsoft では、このチュートリアルで説明し、使用するデータ注釈モデル バインダーの公式製品サポートを提供していません。Although the Data Annotations Model Binder was created by the Microsoft ASP.NET MVC team, Microsoft does not offer official product support for the Data Annotations Model Binder described and used in this tutorial.

データ注釈モデル バインダーの使用Using the Data Annotation Model Binder

ASP.NET MVC アプリケーションでデータ注釈モデル バインダーを使用するには、まず、Microsoft.Web.Mvc.DataAnnotations.dll アセンブリと System.ComponentModel.DataAnnotations.dll アセンブリへの参照を追加する必要があります。In order to use the Data Annotations Model Binder in an ASP.NET MVC application, you first need to add a reference to the Microsoft.Web.Mvc.DataAnnotations.dll assembly and the System.ComponentModel.DataAnnotations.dll assembly. メニュー オプションの [プロジェクト]、[参照の追加] を選択します。Select the menu option Project, Add Reference. 次に、[参照] タブをクリックし、データ注釈モデル バインダーのサンプルをダウンロード (および解凍) した場所を参照します (図 1を参照)。Next click the Browse tab and browse to the location where you downloaded (and unzipped) the Data Annotations Model Binder sample (see Figure 1).

図 1: データ注釈モデル バインダーへの参照の追加 (フルサイズの画像を表示する をクリック)Figure 1: Adding a reference to the Data Annotations Model Binder (Click to view full-size image)

アセンブリとシステム.コンポーネントモデル.データアノテーション.dll アセンブリの両方を選択し 、[OK] ボタンをクリックします。Select both the Microsoft.Web.Mvc.DataAnnotations.dll assembly and the System.ComponentModel.DataAnnotations.dll assembly and click the OK button.

データ注釈モデル バインダーでは、.NET Framework サービス パック 1 に含まれる System.ComponentModel.DataAnnotations.dll アセンブリを使用することはできません。You cannot use the System.ComponentModel.DataAnnotations.dll assembly included with .NET Framework Service Pack 1 with the Data Annotations Model Binder. データ注釈モデル バインダーサンプルに含まれるバージョンの System.ComponentModel.DataAnnotations.dll アセンブリを使用する必要があります。You must use the version of the System.ComponentModel.DataAnnotations.dll assembly included with the Data Annotations Model Binder Sample download.

最後に、データ注釈モデル バインダーを Global.asax ファイルに登録する必要があります。Finally, you need to register the DataAnnotations Model Binder in the Global.asax file. アプリケーション Start() イベント_ハンドラに次のコード行を追加して、_アプリケーション Start() メソッドを次のようにします。Add the following line of code to the Application_Start() event handler so that the Application_Start() method looks like this:

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder();
}

このコード行は、mvc アプリケーション全体の既定のモデル バインダーとして ataAnnotationsModelBinder ASP.NET登録します。This line of code registers the ataAnnotationsModelBinder as the default model binder for the entire ASP.NET MVC application.

データ注釈検証コントロール属性の使用Using the Data Annotation Validator Attributes

データ注釈モデル バインダーを使用する場合は、検証を実行するためにバリデータ属性を使用します。When you use the Data Annotations Model Binder, you use validator attributes to perform validation. 名前空間には、次の検証属性が含まれています。The System.ComponentModel.DataAnnotations namespace includes the following validator attributes:

  • Range – プロパティの値が指定した範囲の値の間に収まっているかどうかを検証できます。Range – Enables you to validate whether the value of a property falls between a specified range of values.
  • 正規表現 – プロパティの値が指定した正規表現パターンと一致するかどうかを検証できます。RegularExpression – Enables you to validate whether the value of a property matches a specified regular expression pattern.
  • [必須] – 必要に応じてプロパティをマークできます。Required – Enables you to mark a property as required.
  • StringLength – 文字列プロパティの最大長を指定できます。StringLength – Enables you to specify a maximum length for a string property.
  • 検証 – すべての検証コントロール属性の基本クラス。Validation – The base class for all validator attributes.

Note

標準の検証コントロールのいずれでも検証のニーズが満たされない場合は、基本検証属性から新しい検証属性を継承してカスタム検証属性を作成するオプションが常にあります。If your validation needs are not satisfied by any of the standard validators then you always have the option of creating a custom validator attribute by inheriting a new validator attribute from the base Validation attribute.

リスト 1の Product クラスは、これらのバリデータ属性の使用方法を示しています。The Product class in Listing 1 illustrates how to use these validator attributes. [名前]、[説明]、および [単価] プロパティは必須としてマークされます。The Name, Description, and UnitPrice properties are marked as required. Name プロパティには、10 文字未満の文字列長を指定する必要があります。The Name property must have a string length that is less than 10 characters. 最後に、UnitPrice プロパティは、通貨金額を表す正規表現パターンと一致する必要があります。Finally, the UnitPrice property must match a regular expression pattern that represents a currency amount.

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models
{
    
    public class Product
    {
        public int Id { get; set; }

        [Required]
        [StringLength(10)]
        public string Name { get; set; }

        [Required]
        public string Description { get; set; }

        [DisplayName("Price")]
        [RegularExpression(@"^\$?\d+(\.(\d{2}))?$")]
        public decimal UnitPrice { get; set; }
    }
}

リスト 1: モデル\製品.csListing 1: Models\Product.cs

Product クラスは、1 つの追加属性を使用する方法を示しています。The Product class illustrates how to use one additional attribute: the DisplayName attribute. DisplayName 属性を使用すると、プロパティがエラー メッセージに表示されるときに、プロパティの名前を変更できます。The DisplayName attribute enables you to modify the name of the property when the property is displayed in an error message. "単価フィールドが必要です" というエラー メッセージを表示する代わりに、エラー メッセージ "価格フィールドが必要です" を表示できます。Instead of displaying the error message "The UnitPrice field is required" you can display the error message "The Price field is required".

Note

検証コントロールによって表示されるエラー メッセージを完全にカスタマイズする場合は、次のように、検証コントロールの ErrorMessage プロパティにカスタム エラー メッセージを割り当てることができます。<Required(ErrorMessage:="This field needs a value!")>If you want to completely customize the error message displayed by a validator then you can assign a custom error message to the validator's ErrorMessage property like this: <Required(ErrorMessage:="This field needs a value!")>

リスト 1 の Product クラスは 、リスト 2の Create() コントローラ アクションで使用できます。You can use the Product class in Listing 1 with the Create() controller action in Listing 2. このコントローラアクションは、モデルの状態にエラーが含まれる場合に[作成]ビューを再表示します。This controller action redisplays the Create view when model state contains any errors.

using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
         //
        // GET: /Product/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Product/Create

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create([Bind(Exclude="Id")]Product productToCreate)
        {
            if (!ModelState.IsValid)
                return View();

            // TODO: Add insert logic here
            return RedirectToAction("Index");
        }

    }
}

リスト 2: コントローラー\製品コントローラー.vbListing 2: Controllers\ProductController.vb

最後に、リスト 3でビューを作成するには、Create() アクションを右クリックし、メニューオプションの [ビューの追加] を選択します。Finally, you can create the view in Listing 3 by right-clicking the Create() action and selecting the menu option Add View. Product クラスをモデル クラスとして使用して、厳密に型指定されたビューを作成します。Create a strongly-typed view with the Product class as the model class. [ビュー コンテンツ] ドロップダウン リストから [作成] を選択します (図 2を参照)。Select Create from the view content dropdown list (see Figure 2).

図2: 作成ビューの追加Figure 2: Adding the Create View

<%@ Page Title="" Language="C#" MasterPageFile="Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Product>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Create</h2>

    <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

    <% using (Html.BeginForm()) {%>

        <fieldset>
            <legend>Fields</legend>
            <p>
                <label for="Name">Name:</label>
                <%= Html.TextBox("Name") %>
                <%= Html.ValidationMessage("Name", "*") %>
            </p>
            <p>
                <label for="Description">Description:</label>
                <%= Html.TextBox("Description") %>
                <%= Html.ValidationMessage("Description", "*") %>
            </p>
            <p>
                <label for="UnitPrice">Price:</label>
                <%= Html.TextBox("UnitPrice") %>
                <%= Html.ValidationMessage("UnitPrice", "*") %>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% } %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

リスト 3: ビュー\製品\作成.aspxListing 3: Views\Product\Create.aspx

Note

[ビューの追加] メニュー オプションで生成された [作成] フォームから [ID] フィールドを削除します。Remove the Id field from the Create form generated by the Add View menu option. Id フィールドは ID 列に対応するため、ユーザーがこのフィールドに値を入力できないようにします。Because the Id field corresponds to an Identity column, you don't want to allow users to enter a value for this field.

製品を作成するフォームを送信し、必須フィールドの値を入力しない場合は、図 3の検証エラー メッセージが表示されます。If you submit the form for creating a Product and you do not enter values for the required fields, then the validation error messages in Figure 3 are displayed.

図 3: 必須フィールドが見つからないFigure 3: Missing required fields

無効な通貨金額を入力すると、図 4のエラー メッセージが表示されます。If you enter an invalid currency amount, then the error message in Figure 4 is displayed.

図4: 無効な通貨金額Figure 4: Invalid currency amount

エンティティ フレームワークでのデータ注釈検証コントロールの使用Using Data Annotation Validators with the Entity Framework

Microsoft Entity Framework を使用してデータ モデル クラスを生成する場合は、検証コントロール属性をクラスに直接適用することはできません。If you are using the Microsoft Entity Framework to generate your data model classes then you cannot apply the validator attributes directly to your classes. Entity Framework デザイナーはモデル クラスを生成するため、モデル クラスに加えた変更は、次にデザイナーで変更を加えた時点で上書きされます。Because the Entity Framework Designer generates the model classes, any changes you make to the model classes will be overwritten the next time you make any changes in the Designer.

Entity Framework によって生成されたクラスで検証コントロールを使用する場合は、メタ データ クラスを作成する必要があります。If you want to use the validators with the classes generated by the Entity Framework then you need to create meta data classes. 検証コントロールを実際のクラスに適用する代わりに、メタ データ クラスに検証コントロールを適用します。You apply the validators to the meta data class instead of applying the validators to the actual class.

たとえば、Entity Framework を使用して Movie クラスを作成したとします (図 5を参照)。For example, imagine that you have created a Movie class using the Entity Framework (see Figure 5). さらに、ムービータイトルとディレクターのプロパティを必要なプロパティにしたいと考えてください。Imagine, furthermore, that you want to make the Movie Title and Director properties required properties. この場合は、リスト 4で部分クラスとメタ データ クラスを作成できます。In that case, you can create the partial class and meta data class in Listing 4.

図 5: エンティティ フレームワークによって生成されたムービー クラスFigure 5: Movie class generated by Entity Framework

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models
{
    [MetadataType(typeof(MovieMetaData))]
    public partial class Movie
    {
    }

    public class MovieMetaData
    {
        [Required]
        public object Title { get; set; }

        [Required]
        [StringLength(5)]
        public object Director { get; set; }

        [DisplayName("Date Released")]
        [Required]
        public object DateReleased { get; set; }
    }

}

リスト4: モデル\Movie.csListing 4: Models\Movie.cs

リスト 4のファイルには、ムービーとムービーメタデータという名前の 2 つのクラスが含まれています。The file in Listing 4 contains two classes named Movie and MovieMetaData. Movie クラスは部分クラスです。The Movie class is a partial class. これは、DataModel.Designer.vb ファイルに含まれるエンティティ フレームワークによって生成された部分クラスに対応します。It corresponds to the partial class generated by the Entity Framework that is contained in the DataModel.Designer.vb file.

現在、.NET フレームワークは部分的なプロパティをサポートしていません。Currently, the .NET framework does not support partial properties. したがって、リスト 4で定義されているムービー クラスのプロパティにバリデータ属性を適用することによって、DataModel.Designer.vb ファイルで定義されているムービー クラスのプロパティに検証コントロール属性を適用する方法はありません。Therefore, there is no way to apply the validator attributes to the properties of the Movie class defined in the DataModel.Designer.vb file by applying the validator attributes to the properties of the Movie class defined in the file in Listing 4.

ムービー部分クラスは、MovieMetaData クラスを指すメタデータ型属性で修飾されていることに注意してください。Notice that the Movie partial class is decorated with a MetadataType attribute that points at the MovieMetaData class. クラスには、ムービー クラスのプロパティのプロキシ プロパティが含まれています。The MovieMetaData class contains proxy properties for the properties of the Movie class.

検証コントロール属性は、MovieMetaData クラスのプロパティに適用されます。The validator attributes are applied to the properties of the MovieMetaData class. タイトル、ディレクター、および日付リリースのプロパティはすべて必須プロパティとしてマークされます。The Title, Director, and DateReleased properties are all marked as required properties. Director プロパティには、5 文字未満の文字列を割り当てる必要があります。The Director property must be assigned a string that contains less than 5 characters. 最後に、"日付解放日フィールドが必要です" などのエラー メッセージを表示するには、"DateReleased/日付のリリース" プロパティに "DisplayName/ 表示名" 属性が適用されます。Finally, the DisplayName attribute is applied to the DateReleased property to display an error message like "The Date Released field is required." エラーの代わりに"日付がリリースされました" フィールドが必要です。instead of the error "The DateReleased field is required."

Note

MovieMetaData クラスのプロキシ プロパティは、ムービー クラスの対応するプロパティと同じ型を表す必要はありません。Notice that the proxy properties in the MovieMetaData class do not need to represent the same types as the corresponding properties in the Movie class. たとえば、Director プロパティは、Movie クラスの文字列プロパティと MovieMetaData クラスのオブジェクト プロパティです。For example, the Director property is a string property in the Movie class and an object property in the MovieMetaData class.

図 6のページは、ムービーのプロパティに無効な値を入力したときに返されるエラー メッセージを示しています。The page in Figure 6 illustrates the error messages returned when you enter invalid values for the Movie properties.

図 6: エンティティ フレームワークで検証コントロールを使用する (フルサイズの画像を表示する をクリック)Figure 6: Using validators with the Entity Framework (Click to view full-size image)

まとめSummary

このチュートリアルでは、データ注釈モデル バインダーを利用して、ASP.NET MVC アプリケーション内で検証を実行する方法を学習しました。In this tutorial, you learned how to take advantage of the Data Annotation Model Binder to perform validation within an ASP.NET MVC application. 次の手順では、Required 属性や StringLength 属性など、さまざまな種類のバリデータ属性の使用方法について説明しました。You learned how to use the different types of validator attributes such as the Required and StringLength attributes. また、Microsoft エンティティ フレームワークを使用する際にこれらの属性を使用する方法についても説明しました。You also learned how to use these attributes when working with the Microsoft Entity Framework.