Share via


Entity Framework 4.0 Database First と ASP.NET 4 Web Forms を使用したはじめに - パート 8

作成者: Tom Dykstra

Contoso University サンプル Web アプリケーションは、Entity Framework 4.0 と Visual Studio 2010 を使用して ASP.NET Web Forms アプリケーションを作成する方法を示しています。 チュートリアル シリーズの詳細については、シリーズの最初のチュートリアルを参照してください。

動的データ機能を使用したデータの書式設定と検証

前のチュートリアルでは、ストアド プロシージャを実装しました。 このチュートリアルでは、動的データ機能で次の利点を提供する方法について説明します。

  • フィールドは、データ型に基づいて表示用に自動的に書式設定されます。
  • フィールドは、データ型に基づいて自動的に検証されます。
  • メタデータをデータ モデルに追加して、書式設定と検証の動作をカスタマイズできます。 これを行うと、1 つの場所に書式設定と検証ルールを追加するだけで、動的データ コントロールを使用してフィールドにアクセスするすべての場所に自動的に適用されます。

このしくみを確認するには、既存の Students.aspx ページのフィールドの表示と編集に使用するコントロールを変更し、エンティティ型の名前と日付フィールドに書式設定と検証メタデータを Student 追加します。

Image01

DynamicField コントロールと DynamicControl コントロールの使用

Students.aspx ページを開き、コントロールで StudentsGridViewName 要素と Enrollment DateTemplateField 要素を次のマークアップに置き換えます。

<asp:TemplateField HeaderText="Name" SortExpression="LastName">
                <EditItemTemplate>
                    <asp:DynamicControl ID="LastNameTextBox" runat="server" DataField="LastName" Mode="Edit" />
                    <asp:DynamicControl ID="FirstNameTextBox" runat="server" DataField="FirstMidName" Mode="Edit" />
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:DynamicControl ID="LastNameLabel" runat="server" DataField="LastName" Mode="ReadOnly" />,
                    <asp:DynamicControl ID="FirstNameLabel" runat="server" DataField="FirstMidName" Mode="ReadOnly" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date" SortExpression="EnrollmentDate" />

このマークアップではDynamicControl、学生名テンプレート フィールドの コントロールと Label コントロールのTextBox代わりに コントロールが使用され、登録日にDynamicFieldコントロールが使用されます。 書式指定文字列は指定されません。

コントロールの後に ValidationSummary コントロールを追加します StudentsGridView

<asp:ValidationSummary ID="StudentsValidationSummary" runat="server" ShowSummary="true"
        DisplayMode="BulletList" Style="color: Red" />

コントロールでは、 SearchGridView 要素を省略する以外は、コントロールで行ったように 、Name 列と Enrollment Date 列の StudentsGridView マークアップを EditItemTemplate 置き換えます。 Columnsコントロールの 要素にSearchGridView、次のマークアップが含まれるようになりました。

<asp:TemplateField HeaderText="Name" SortExpression="LastName">
                <ItemTemplate>
                    <asp:DynamicControl ID="LastNameLabel" runat="server" DataField="LastName" Mode="ReadOnly" />,
                    <asp:DynamicControl ID="FirstNameLabel" runat="server" DataField="FirstMidName" Mode="ReadOnly" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date" SortExpression="EnrollmentDate" />

Students.aspx.cs を開き、次usingのステートメントを追加します。

using ContosoUniversity.DAL;

ページ Init のイベントのハンドラーを追加します。

protected void Page_Init(object sender, EventArgs e)
{
    StudentsGridView.EnableDynamicData(typeof(Student));
    SearchGridView.EnableDynamicData(typeof(Student));
}

このコードは、動的データがエンティティのフィールドに対してこれらのデータ バインド コントロールで書式設定と検証を Student 提供することを指定します。 ページの実行時に次の例のようなエラー メッセージが表示される場合は、通常、 で Page_Initメソッドを呼び出すのをEnableDynamicData忘れたことを意味します。

Could not determine a MetaTable. A MetaTable could not be determined for the data source 'StudentsEntityDataSource' and one could not be inferred from the request URL.

ページを実行します。

Image03

[ 登録日] 列には、プロパティの種類が であるため、日付と共に時刻が DateTime表示されます。 後で修正します。

ここでは、動的データによって基本的なデータ検証が自動的に提供されます。 たとえば、[ 編集] をクリックし、日付フィールドをクリアし、[ 更新] をクリックすると、データ モデルで値が null 許容でないため、動的データによって自動的に必須フィールドが作成されます。 ページには、フィールドの後にアスタリスクが表示され、コントロールにエラー メッセージが ValidationSummary 表示されます。

Image05

アスタリスクの上に ValidationSummary マウス ポインターを置くと、エラー メッセージが表示されるため、コントロールを省略できます。

Image06

動的データは、[ 登録日 ] フィールドに入力されたデータが有効な日付であることを検証します。

Image04

ご覧のように、これは一般的なエラー メッセージです。 次のセクションでは、メッセージをカスタマイズする方法と、検証ルールと書式設定ルールを確認します。

データ モデルへのメタデータの追加

通常、動的データによって提供される機能をカスタマイズする必要があります。 たとえば、データの表示方法やエラー メッセージの内容を変更できます。 また、通常は、データ型に基づいて動的データが自動的に提供する機能よりも多くの機能を提供するように、データ検証ルールをカスタマイズします。 これを行うには、エンティティ型に対応する部分クラスを作成します。

ソリューション エクスプローラーで、ContosoUniversity プロジェクトを右クリックし、[参照の追加] を選択し、 への参照をSystem.ComponentModel.DataAnnotations追加します。

Image11

DAL フォルダーで、新しいクラス ファイルを作成し、Student.cs という名前を付け、テンプレート コードを次のコードに置き換えます。

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

namespace ContosoUniversity.DAL
{
    [MetadataType(typeof(StudentMetadata))]
    public partial class Student
    {
    }

    public class StudentMetadata
    {
        [DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
        public DateTime EnrollmentDate { get; set; }

        [StringLength(25, ErrorMessage = "First name must be 25 characters or less in length.")]
        [Required(ErrorMessage="First name is required.")]
        public String FirstMidName { get; set; }

        [StringLength(25, ErrorMessage = "Last name must be 25 characters or less in length.")]
        [Required(ErrorMessage = "Last name is required.")]
        public String LastName { get; set; }
    }
}

このコードは、エンティティの部分クラスを Student 作成します。 この部分クラスに適用される属性は MetadataType 、メタデータを指定するために使用しているクラスを識別します。 メタデータ クラスには任意の名前を付けることができますが、エンティティ名と "Metadata" を使用することは一般的な方法です。

メタデータ クラスのプロパティに適用される属性は、書式設定、検証、ルール、およびエラー メッセージを指定します。 ここに示す属性の結果は次のようになります。

  • EnrollmentDate は日付 (時刻なし) として表示されます。
  • 両方の名前フィールドの長さは 25 文字以下にする必要があり、カスタム エラー メッセージが表示されます。
  • どちらの名前フィールドも必須であり、カスタム エラー メッセージが表示されます。

Students.aspx ページをもう一度実行すると、日付が時刻なしで表示されることがわかります。

Image08

行を編集し、名前フィールドの値をクリアします。 フィールドのエラーを示すアスタリスクは、フィールドを離れるとすぐに 、[ 更新] をクリックする前に表示されます。 [更新] をクリックすると、指定したエラー メッセージ テキストがページに表示されます。

Image10

25 文字を超える名前を入力し、[ 更新] をクリックすると、指定したエラー メッセージ テキストがページに表示されます。

Image09

データ モデル メタデータでこれらの書式設定と検証ルールを設定したので、これらのフィールドを表示または許可するすべてのページで、または DynamicField コントロールを使用DynamicControlする限り、ルールが自動的に適用されます。 これにより、記述する必要がある冗長コードの量が減り、プログラミングとテストが容易になり、アプリケーション全体でデータの書式設定と検証の一貫性が確保されます。

詳細情報

これで、Entity Framework を使用したはじめにに関するこの一連のチュートリアルが終了します。 Entity Framework の使用方法を学習するのに役立つその他のリソースについては、 次の Entity Framework チュートリアル シリーズの最初のチュートリアルに 進むか、次のサイトを参照してください。