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

によってMicrosoftby Microsoft

ASP.NET MVC アプリケーション内の検証を実行するには、データ注釈モデル バインダーの活用します。Take advantage of the Data Annotation Model Binder to perform validation within an ASP.NET MVC application. 検証属性の種類を使用して Microsoft Entity Framework に処理する方法について説明します。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 つまたは複数の属性や 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. CodePlex の web サイトからデータ注釈のモデル バインダーのサンプルをダウンロードするにはクリックしてここします。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)

Microsoft.Web.Mvc.DataAnnotations.dll アセンブリと system.componentmodel.dataannotations.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 Service Pack 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 ファイルで、DataAnnotations のモデル バインダーを登録する必要があります。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();
}

次のコードでは、ASP.NET MVC アプリケーション全体の既定のモデル バインダーとして、ataAnnotationsModelBinder を登録します。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. System.ComponentModel.DataAnnotations 名前空間には、次の検証属性が含まれています。The System.ComponentModel.DataAnnotations namespace includes the following validator attributes:

  • 範囲は – プロパティの値が、指定した値の範囲があるかどうかを検証することができます。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.

Product クラスリスト 1これらの検証属性を使用する方法を示しています。The Product class in Listing 1 illustrates how to use these validator attributes. 名前、説明、および UnitPrice プロパティがマークされている必須とします。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:Models\Product.csListing 1: Models\Product.cs

Product クラスは、1 つの追加属性を使用する方法を示しています。 DisplayName 属性。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. 「UnitPrice フィールドが必要です」エラー メッセージを表示する代わりには「価格フィールドが必要です」エラー メッセージ表示できます。Instead of displaying the error message "The UnitPrice field is required" you can display the error message "The Price field is required".

Note

検証コントロールによって表示されるエラー メッセージを完全にカスタマイズする場合は、このような検証コントロールのエラー メッセージのプロパティに、カスタム エラー メッセージを割り当てることができます。 <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!")>

Product クラスを使用するリスト 1で Create() コント ローラー アクションでリスト 2You 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:Controllers\ProductController.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. 製品クラスを使用して、モデル クラスとして厳密に型指定されたビューを作成します。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.:Views\Product\Create.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

Entity Framework でのデータ注釈検証コントロールの使用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 を使用してクラスを作成した (を参照してください図 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:Entity Framework によって生成されたムービー クラス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:Models\Movie.csListing 4: Models\Movie.cs

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

現時点では、.NET framework には、一部のプロパティはできません。Currently, the .NET framework does not support partial properties. そのため、ファイル内に定義されているムービー クラスのプロパティに検証属性を適用することで、DataModel.Designer.vb ファイルで定義されているムービー クラスのプロパティに検証属性を適用する方法はありませんリスト4.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 クラス MetadataType 属性で修飾されたことに注意してください。Notice that the Movie partial class is decorated with a MetadataType attribute that points at the MovieMetaData class. MovieMetaData クラスには、プロパティ、Movie クラスのプロキシのプロパティが含まれています。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. タイトル、監督、および DateReleased プロパティは、すべての必須プロパティとしてマークされます。The Title, Director, and DateReleased properties are all marked as required properties. ディレクター プロパティには、5 未満の場合の文字を含む文字列を割り当てる必要があります。The Director property must be assigned a string that contains less than 5 characters. DisplayName 属性を「リリース済みの日付フィールドが必要です」ようなエラー メッセージを表示する DateReleased プロパティに適用する最後に、Finally, the DisplayName attribute is applied to the DateReleased property to display an error message like "The Date Released field is required." エラーではなく「DateReleased フィールドが必要です。」instead of the error "The DateReleased field is required."

Note

MovieMetaData クラスでプロキシのプロパティが、Movie クラス内の対応するプロパティと同じ型を表す必要がないことに注意してください。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. たとえば、ディレクター プロパティは、ムービー クラスの文字列プロパティと 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:Entity Framework での検証コントロールの使用 (フルサイズの画像を表示する をクリックします)。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. など、必要な検証属性や StringLength 属性の種類を使用する方法を学習しました。You learned how to use the different types of validator attributes such as the Required and StringLength attributes. Microsoft Entity Framework を使用する場合は、これらの属性を使用する方法も学習しました。You also learned how to use these attributes when working with the Microsoft Entity Framework.