次の方法で共有


ASP.NET Dynamic Data スキャフォールディングとページ テンプレートの概要

更新 : 2007 年 11 月

データの表示と編集は、ソフトウェア開発において繰り返し発生するタスクです。ASP.NET Dynamic Data を使用すると、データ ドリブン アプリケーションを最小限のコードで作成できます。コードを記述する必要がない場合もあります。スキャフォールディング機構は、このようなアプリケーションの迅速な生成を可能にする、Dynamic Data の重要な機能です。

このトピックの内容は次のとおりです。

  • スキャフォールディング

  • ページ テンプレート

スキャフォールディング

スキャフォールディングは、既存の ASP.NET ページ フレームワークの機能を利用し、背後で物理ページを使用せずに、データ モデルに基づいてページを表示するように拡張する機構です。

スキャフォールディング機構を使用すると、次のような利点があります。

  • データ ドリブン Web アプリケーションを作成するためのコードが最小または不要になる。

  • 開発期間が短縮される。

  • 完全に機能するページを作成できる。すべてのデータベース操作 (表示、挿入、編集、削除)、並べ替え機能、およびページング機能に対応できます。

  • データベース スキーマに基づく組み込みのデータ検証を利用できる。

  • それぞれの外部キーまたはブール値フィールドに対して自動フィルタが作成される。

Dynamic Data では、要求の照合と処理に URL ルーティングを使用します。スキャフォールディング機構は、要求された URL から、ユーザーが表示しようとしているビューおよびテーブルを推測します。ルーティング機構を使用する利点は、要求された URL とアプリケーションの物理パスとが一致する必要がないことです。

スキャフォールディング機構の有効化

スキャフォールディング機構は、既定で無効になっています。スキャフォールディング機構を有効にすると、表示、編集、挿入、および削除の各機能のためにデータ モデル全体が公開されるため、セキュリティ上のリスクが発生します。したがって、有効化は慎重に行ってください。

スキャフォールディング機構を有効にするには、次の方法を使用します。

Dynamic Data 機能を使用する場合は、スキャフォールディング機構を使用しない場合でも、データ コンテキストを登録する必要があります。データ コンテキストの登録は、global.asax ファイルで RegisterContext メソッドを使用して行います。RegisterContext メソッドは、ContextConfiguration オブジェクトをパラメータとして受け取ります。データ コンテキストを登録すると同時にスキャフォールディング機構を有効にするには、ContextConfiguration オブジェクトの ScaffoldAllTables プロパティを true に設定します。これにより、データ モデル全体に対してスキャフォールディング機構が有効になります。言い換えると、データ モデル内のすべてのテーブルが、表示、編集、挿入、および削除の各機能のために公開されます。スキャフォールディング機構からテーブルを隠す必要がある場合は、ScaffoldTableAttribute 属性を使用します。

次の例では、AdventureWorksLT データベースのデータ コンテキストを登録すると共に、データ モデル内のすべてのテーブルに対してスキャフォールディング機構を有効にしています。

model.RegisterContext(GetType(AdventureWorksLTDataContext), _
                      New ContextConfiguration() With {.ScaffoldAllTables = True})
model.RegisterContext(typeof(AdventureWorksLTDataContext),
    new ContextConfiguration() { ScaffoldAllTables = true });

どのテーブルを公開するかをより細かく制御するには、ScaffoldTableAttribute 属性を使用して、特定のテーブルに対してスキャフォールディング機構を有効または無効にします。データ モデル全体を公開してから、公開する必要のないテーブルを隠す代わりに、アプリケーションで必要なテーブルだけを公開することができます。ScaffoldTableAttribute 属性を適用するには、データ モデル内のエンティティ クラスと同じ名前を持つ部分クラスを作成し、この部分クラスに属性を適用する必要があります。

次の例は、個々のテーブルに対してスキャフォールディング機構を有効にする方法を示しています。

Imports System.ComponentModel.DataAnnotations

<ScaffoldTable(True)> _
Partial Public Class Product
End Class
using System.ComponentModel.DataAnnotations;

[ScaffoldTable(true)]
public partial class Product {
}

公開されるデータ フィールドをより詳細に制御するには、ScaffoldColumnAttribute 属性を使用して、特定のデータ フィールドに対してスキャフォールディング機構を有効または無効にします。

既定では、Dynamic Data は一部のデータ フィールドを表示しません。データ フィールドを表示するかどうかを決定するために Dynamic Data で使用される規則のうち、重要なものをいくつか次に示します。

  • ScaffoldColumnAttribute 属性が適用されているデータ フィールドは表示されます。この規則は、以降のすべての規則をオーバーライドします。

  • UIHintAttribute 属性が適用されているデータ フィールドは表示されます。この規則は、以降のすべての規則をオーバーライドします。

  • 外部キー フィールドのデータ フィールドは表示されません。これは、Dynamic Data が外部キー フィールドを別の方法で処理し、通常は外部キー フィールドの値を表示しないためです。

  • データベースで自動的に生成されるデータ フィールドは表示されません。通常、このようなフィールドには関連情報が含まれません。データ フィールドを表示する必要がある場合は、データ フィールドに UIHintAttribute 属性を適用してください。

IsCustomProperty プロパティの値が true の場合、データ フィールドは表示されません。

ScaffoldColumnAttribute 属性を適用するには、ScaffoldColumnAttribute 属性をデータ フィールドに適用する関連メタデータ クラスを作成し、データ モデル内のエンティティ クラスと同じ名前を持つ部分クラスを作成する必要があります。次に、MetadataTypeAttribute 属性を部分クラスに適用して、これらの 2 つのクラスを関連付ける必要があります。

次の例は、PasswordHash と PasswordSalt というデータ フィールドをスキャフォールディング機構から隠す方法を示しています。

Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(Customer_Metadata))> _
Partial Public Class Customer

End Class

Public Class Customer_Metadata
    <ScaffoldColumn(False)> _
    Public PasswordHash As Object

    <ScaffoldColumn(False)> _
    Public PasswordSalt As Object
End Class
using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(Customer_Metadata))]
public partial class Customer
{
}

public class Customer_Metadata
{
    [ScaffoldColumn(false)]
    public object PasswordHash;

    [ScaffoldColumn(false)]
    public object PasswordSalt;
}

ページ テンプレート

ASP.NET Dynamic Data スキャフォールディング機構では、テンプレートを使用して、データの既定のビューが提供されます。テンプレートは通常の ASP.NET ページです。つまり、テンプレートを変更することで、Web アプリケーションで生成されるページの外観や動作を変更できます。

ASP.NET Dynamic Data アプリケーションを作成すると、プロジェクト テンプレートにより、プロジェクトに DynamicData フォルダが追加されます。次の表は、Dynamic Data によって DynamicData\PageTemplates フォルダに追加されるページ テンプレートの一覧です。

ページ テンプレート名

説明

Details.aspx

データベースの単一行の詳細なビューを提供します。DetailsView コントロールを使用してデータを表示します。選択操作に使用される既定のテンプレートです。

Edit.aspx

データベース テーブルの単一行を編集するためのインターフェイスを提供します。DetailsView コントロールを使用してデータを編集します。編集操作に使用される既定のテンプレートです。

Insert.aspx

データベース テーブルに単一行を挿入するためのインターフェイスを提供します。DetailsView コントロールを使用してデータを挿入します。挿入操作に使用される既定のテンプレートです。

List.aspx

データベース テーブルの行のリストを表示します。各外部キー列またはブール型列のデータをフィルタ処理するための DropDownList コントロールと、並べ替え機能およびページング機能を提供します。行のリストには GridView コントロールを使用します。表示操作に使用される既定のテンプレートです。

ListDetails.aspx

データベース テーブルの行のリストを表示します。各外部キー列またはブール型列のデータをフィルタ処理するための DropDownList コントロールと、並べ替え機能およびページング機能を提供します。行のリストには GridView コントロールを使用し、選択された行の表示と新しいレコードの挿入には DetailsView コントロールを使用します。オールインワンの機能を持つテンプレートです。既定では使用されませんが、Global.asax ファイルの構成を変更することで、このテンプレートを使用できます。

Dynamic Data が提供するすべての既定のテンプレートには、次のような共通の特徴があります。

  • これらのテンプレートでは、ルート フォルダにある Site.master という名前のマスタ ページが使用されます。マスタ ページには、スタイルシートと基本的なヘッダーが定義され、Web サイトに対する AJAX 機能を有効にするための ScriptManager コントロールが含まれています。デバッグ上必要な場合は、部分ページ更新を無効にできます。そのためには、ScriptManager コントロールの EnablePartialRendering プロパティを false に設定します。詳細については、「AJAX およびクライアント機能の追加」を参照してください。

  • それぞれのページ テンプレートには、ポストバックを行わない部分レンダリングを有効にするための UpdatePanel コントロールが含まれています。詳細については、「UpdatePanel Web サーバー コントロールの宣言構文」を参照してください。

  • それぞれのページ テンプレートには、テンプレート内のデータ バインド コントロールとデータ ソース コントロールに動的な動作を追加するための DynamicDataManager コントロールも含まれています。

ページ テンプレートのカスタマイズ

Dynamic Data では、付属するテンプレートをカスタマイズできます。これを行うには次の 2 つの方法があります。

  • 組み込みのページ テンプレートをカスタマイズする。

  • 特定のテーブルのレイアウトをカスタマイズする。

組み込みのページ テンプレートをカスタマイズするには、DynamicData\PageTemplates フォルダにあるページを変更します。この場所に加えた変更は、スキャフォールディング機構を使用している、Web アプリケーションで生成されるページの外観や動作に作用します。

スキャフォールディング機構を使用し、特定のテーブルに対してカスタム ページを作成することができます。そのためには、DynamicData\CustomPages フォルダの下に、データ モデルのエンティティ テーブルと同じ名前のフォルダを作成します。この新しいフォルダ内に、グローバルに使用するページ テンプレートと同じ名前のページを追加します。たとえば、テーブルに対する詳細ページを作成する場合は、Details.aspx という名前をページに付けます。組み込みのページ テンプレートは、カスタム ページを作成する場合の出発点として使用できます。例については、「方法 : カスタム ページ テンプレートを使用して個々のテーブルのレイアウトをカスタマイズする」を参照してください。

ルートのカスタマイズ

既に説明したように、Dynamic Data では、URL 要求の照合と処理に ASP.NET ルーティングを使用します。ルートは global.asax ファイルで定義されます。既定では、Dynamic Data は操作 (表示、選択、編集、および挿入) ごとに異なるページ テンプレートを使用します。削除操作には固有のページ テンプレートが必要ないため、削除機能はリスト ページと詳細ページの両方に表示されます。

ルートをカスタマイズすることで、異なる URL を表示できます。それ以外に、ルートを使用して異なるページ テンプレートを指定したり、URL からファイル名の拡張子を削除したりできます。さらに、クエリ文字列値の代わりにルートを使用してパラメータを渡すこともできます。ルートの詳細については、「ASP.NET ルーティング」を参照してください。

次の例は、すべての操作で 1 つのページ テンプレートを使用するようにルートを指定する方法を示しています。1 つ目のルートにより、特定のテーブルに対するすべての操作が 1 つのページで可能になります。2 つ目のルートは、レコードの詳細への移動を可能にします。たとえば、外部キー フィールドがある場合にリレーションシップ テーブルに移動できます。

routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
  .Action = PageAction.List, _
  .ViewName = "ListDetails", _
  .Model = model})

routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
  .Action = PageAction.Details, _
  .ViewName = "ListDetails", _
  .Model = model})
routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
    Action = PageAction.List,
    ViewName = "ListDetails",
    Model = model
});

routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
    Action = PageAction.Details,
    ViewName = "ListDetails",
    Model = model
});

特定のテーブルに対して特定のルートを作成することもできます。そのためには、他のテーブルで使用されるものとは異なるページ テンプレートを指定します。ルートは、定義されている順序で分析されます。まず限定的なルートを定義した後で、汎用的なルートを定義する必要があります。

次の例では、AdventureWorks データベースの Products テーブルに対して別のページ テンプレートを指定した後、データベースの他のテーブルに対して汎用的なルートを指定しています。

routes.Add(New DynamicDataRoute("Products/{action}.aspx") With { _
  .ViewName = "ListDetails", _
  .Table = "Products", _
  .Model = model})

routes.Add(New DynamicDataRoute("{table}/{action}.aspx") With { _
  .Constraints = New RouteValueDictionary( _
    New With {.Action = "List|Details|Edit|Insert"}), _
  .Model = model})
routes.Add(new DynamicDataRoute("Products/{action}.aspx")
{
    ViewName = "ListDetails",
    Table = "Products",
    Model = model
});

routes.Add(new DynamicDataRoute("{table}/{action}.aspx")
{
    Constraints = new RouteValueDictionary(
      new { action = "List|Details|Edit|Insert" }),
    Model = model
});

参照

概念

ASP.NET Dynamic Data の概要

ASP.NET ルーティング