メタデータの編集とカスタマイズページの利用方法
サンプル1は、Dynamic Dataを実行するまででした。ファイルやソースが自動生成されていたので、直接設定する場所はわずかでしたが、サンプル2では、Dynamic Dataのメタデータの編集などを行います。こちらはソース解説部分すべて開発者が記述する必要があります。
サンプル作成手順
サンプル作成手順は次のようになります。同時にそれぞれの項目について理解することもできます。
- Modelフォルダへのクラスの追加
- 表示データの編集(メタデータの設定)
- 表示ページのカスタマイズ
Modelフォルダへのクラスの追加
最初に、表示ページのカスタマイズで利用するので、Pubs.dbml
クラスにサーバーエクスプローラからauthorテーブルをドラッグしてデザイン画面へとドロップし、保存します。
続いて、Modelフォルダ上にクラスを追加します。
[新しい項目の追加]を選択し、クラス-「employee.vb」と名前を付けて追加します(同様にtitles.vb/author.vbも用意します)。
このクラスはパーシャルクラスとして利用するので、モデルのテーブル名と同一に設定します。
表示データの編集(メタデータの設定)
サンプル1実行時にemployeeテーブルのList.aspxは図5のように表示されていました。しかし、実際にDynamic Dataを利用するときにすべての値を表示する必要はあるでしょうか?
通常のASP.NETのGridViewでは列を削除するなどで対応できますが、Dynamic Dataの場合はテンプレートをすべてのテーブルで利用します。つまり、通常設定する場合はメタデータを設定し表示データを編集することになります。メタデータは、データモデル化されているので、列名のプロパティに属性を付加することで、編集が反映されます。
例えば、"emp_id"と"job_lvl"の列を非表示にしたい場合は、DataAnnotations名前空間の'ScaffoldColumn'属性クラスをFalseに設定することで実現できます。
Imports System.ComponentModel Imports System.ComponentModel.DataAnnotations ' Pubs.dbmlとemployeeMetadataパーシャルクラスを紐付ける <MetadataType(GetType(employee.employeeMetadata))> _ Public Class employee ' employeeテーブルのメタデータパーシャルクラス Partial Public Class employeeMetadata ' emp_idのメタデータプロパティの設定 Private _emp_id As Object ' ScaffoldColumn属性の設定により、emp_idを非表示に設定 <ScaffoldColumn(False)> _ Public Property emp_id() As Object Get Return _emp_id End Get Set(ByVal value As Object) _emp_id = value End Set End Property <中略:同様の設定をjob_lvlにも行う> End Class End Class
実行結果は図11になります。
また、titlesテーブルのメタデータには、よく使うであろうDisplayFormat
属性、StringLength
属性、Required
属性を次のように設定します。
Imports System.ComponentModel.DataAnnotations <MetadataType(GetType(titles.titlesMetadata))> _ Public Class titles Partial Public Class titlesMetadata Private _pubdate As Object ' DisplayFormat属性の設定により、pubdateのフォーマットをyyyy-MM-ddに設定 <DisplayFormat(DataFormatString:="{0:yyyy-MM-dd}")> _ Public Property pubdate() As Object Get Return _pubdate End Get Set(ByVal value As Object) _pubdate = value End Set End Property Private _title As Object ' StringLength属性の設定により、titleの最大文字数を50に設定 ' Required属性の設定により、titleの入力必須のエラーメッセージを設定 <StringLength(50)> _ <Required(ErrorMessage:="titleは入力必須です。")> _ Public Property title() As Object Get Return _title End Get Set(ByVal value As Object) _title = value End Set End Property End Class End Class
実行結果は図13・15になります(属性変更前の画像と対比して見てください)。
![図15 属性変更後のtitlesテーブルのEdit.aspx](http://cz-cdn.shoeisha.jp/static/images/article/3060/015.gif)
表示ページのカスタマイズ
前項でも触れましたが、Dynamic Dataでは基本的に、1つのテンプレートフォルダをすべてのデータモデルで利用する構造になっています。
これは汎用的であると同時に、細かな点で若干不自由に感じることもあるかと思います。そんな時は、CustomPagesフォルダを使用して、独自のページを作成することで自由な表示ができるようになります。
Authorsフォルダの作成とListページの編集
CustomPagesフォルダの使用方法は簡単で、直下にテーブル名フォルダを作成し、表示するページ(List/Details/Edit/Insert)を配置するだけです。表示するページはルーティングの設定に依存します。
今回は「authors」フォルダを作成し、直下にPageTemplatesフォルダのList.aspxをコピーして配置します。
List.aspxからコードビハインドファイルを削除し(ページディレクティブの指定も削除)、GridViewコントロールのタスクから[列の編集...]を選択します。
フィールドダイアログ上で、左下に表示される自動生成フィールドのチェックを外し、使用できるフィールドから[DynamicField]を選択して、[追加]ボタンを押します(計6個追加)。
追加したフィールドには以下の設定を行ってください。
HeaderText | DataField |
lastname | au_lname |
firstname | au_fname |
phone | phone |
city | city |
state | state |
zip | zip |
表示だけであれば、上記の設定で完成です(図16~17)。サンプルプログラムでは、編集などの不可も行っているので参照してください。