Entity Framework 4.0 Database First と ASP.NET 4 Web Forms を使用したはじめに - パート 8
Contoso University サンプル Web アプリケーションは、Entity Framework 4.0 と Visual Studio 2010 を使用して ASP.NET Web Forms アプリケーションを作成する方法を示しています。 チュートリアル シリーズの詳細については、シリーズの最初のチュートリアルを参照してください。
動的データ機能を使用したデータの書式設定と検証
前のチュートリアルでは、ストアド プロシージャを実装しました。 このチュートリアルでは、動的データ機能で次の利点を提供する方法について説明します。
- フィールドは、データ型に基づいて表示用に自動的に書式設定されます。
- フィールドは、データ型に基づいて自動的に検証されます。
- メタデータをデータ モデルに追加して、書式設定と検証の動作をカスタマイズできます。 これを行うと、1 つの場所に書式設定と検証ルールを追加するだけで、動的データ コントロールを使用してフィールドにアクセスするすべての場所に自動的に適用されます。
このしくみを確認するには、既存の Students.aspx ページのフィールドの表示と編集に使用するコントロールを変更し、エンティティ型の名前と日付フィールドに書式設定と検証メタデータを Student
追加します。
DynamicField コントロールと DynamicControl コントロールの使用
Students.aspx ページを開き、コントロールで StudentsGridView
Name 要素と 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.
ページを実行します。
[ 登録日] 列には、プロパティの種類が であるため、日付と共に時刻が DateTime
表示されます。 後で修正します。
ここでは、動的データによって基本的なデータ検証が自動的に提供されます。 たとえば、[ 編集] をクリックし、日付フィールドをクリアし、[ 更新] をクリックすると、データ モデルで値が null 許容でないため、動的データによって自動的に必須フィールドが作成されます。 ページには、フィールドの後にアスタリスクが表示され、コントロールにエラー メッセージが ValidationSummary
表示されます。
アスタリスクの上に ValidationSummary
マウス ポインターを置くと、エラー メッセージが表示されるため、コントロールを省略できます。
動的データは、[ 登録日 ] フィールドに入力されたデータが有効な日付であることを検証します。
ご覧のように、これは一般的なエラー メッセージです。 次のセクションでは、メッセージをカスタマイズする方法と、検証ルールと書式設定ルールを確認します。
データ モデルへのメタデータの追加
通常、動的データによって提供される機能をカスタマイズする必要があります。 たとえば、データの表示方法やエラー メッセージの内容を変更できます。 また、通常は、データ型に基づいて動的データが自動的に提供する機能よりも多くの機能を提供するように、データ検証ルールをカスタマイズします。 これを行うには、エンティティ型に対応する部分クラスを作成します。
ソリューション エクスプローラーで、ContosoUniversity プロジェクトを右クリックし、[参照の追加] を選択し、 への参照をSystem.ComponentModel.DataAnnotations
追加します。
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 ページをもう一度実行すると、日付が時刻なしで表示されることがわかります。
行を編集し、名前フィールドの値をクリアします。 フィールドのエラーを示すアスタリスクは、フィールドを離れるとすぐに 、[ 更新] をクリックする前に表示されます。 [更新] をクリックすると、指定したエラー メッセージ テキストがページに表示されます。
25 文字を超える名前を入力し、[ 更新] をクリックすると、指定したエラー メッセージ テキストがページに表示されます。
データ モデル メタデータでこれらの書式設定と検証ルールを設定したので、これらのフィールドを表示または許可するすべてのページで、または DynamicField
コントロールを使用DynamicControl
する限り、ルールが自動的に適用されます。 これにより、記述する必要がある冗長コードの量が減り、プログラミングとテストが容易になり、アプリケーション全体でデータの書式設定と検証の一貫性が確保されます。
詳細情報
これで、Entity Framework を使用したはじめにに関するこの一連のチュートリアルが終了します。 Entity Framework の使用方法を学習するのに役立つその他のリソースについては、 次の Entity Framework チュートリアル シリーズの最初のチュートリアルに 進むか、次のサイトを参照してください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示