特集:ASP.NET 4概説(後編)

ASP.NET 4/ASP.NET MVC/Dynamic Dataの新機能

山田 祥寛
2010/07/13
Page1 Page2 Page3

スキャフォールディング機能でCRUD機能を高速開発 - ASP.NET Dynamic Data -

 ASP.NET Dynamic Data(以降、Dynamic Data)は、リレーショナル・データベースをモデリングしたモデル・クラス(以降、データ・モデル)を基に、CRUD(=Create/Read/Update/Delete)機能を持ったアプリケーションを自動生成する機能(=スキャフォールディング機能)のこと。.NET Framework 3.5 SP1で導入された比較的新しい機能であるが、ASP.NET 4では、早くもさまざまな追加機能が盛り込まれている。

(1)多対多リレーションシップの対応

 Entity Frameworkの多対多リレーションシップに対応した。具体的には、多対多リレーションシップを表現するためのフィールド・テンプレート*2として、ManyToMany.ascx、ManyToMany_Edit.ascxが追加された。

 例えば、以下はNorthWindデータベースを基に作成したDynamic Dataアプリケーションの例である。

 次の画面のように、参照系のページでは複数項目のハイパーリンクで、入力系のページでは複数項目のチェックボックスで、それぞれ多対多リレーションシップを表現していることが確認できる。

多対多リレーションシップのフィールドを表示(参照時)

多対多リレーションシップのフィールドを表示(入力時)

*2 データ・モデルの型に応じて、フィールド値を表示するためのテンプレート(ユーザー・コントロール)。Boolean.ascx(ブール型)、DateTime.ascx(日付時刻型)、ForeignKey.ascx(外部キー)などのテンプレートが標準で用意されている。

(2)特殊なデータ型への対応

 データ・モデルに特殊なデータ型として、EmailAddress型、Url型を指定できるようになった。これらのデータ型は、あくまでDynamic Dataでフィールド値をどのように表示するかを制御するための型であり、いわゆるデータベース上でのデータ型とは別である点に注意されたい。

 これらのデータ型を適用するには、メタデータ・クラス(=モデルの付随情報を定義するクラス)の対応するプロパティに、

System.ComponentModel.DataAnnotations.DataType属性

を付与する必要がある。以下が、具体的なコード例である。

using System.ComponentModel.DataAnnotations;

namespace DynamicCs
{
  // データ・モデルにメタデータ・クラスを関連付け
  [MetadataType(typeof(EmployeesMetadata))]
  public partial class Employees
  {
  }

  public class EmployeesMetadata
  {
    // URL型の宣言
    [DataType(DataType.Url)]
    public string PhotoPath;
  }
}
' データ・モデルにメタデータ・クラスを関連付け
<MetadataType(GetType(EmployeesMetadata))>
Partial Public Class Employees

End Class

Public Class EmployeesMetadata
  ' URL型の宣言
  <DataType(DataType.Url)>
  Public PhotoPath As String
End Class
PhotoPathプロパティにURL型を割り当てるコード(上:Employee.cs、下:Employee.vb)

 これによって、該当するフィールド(例ではPhotoPathフィールド)が、次の画面のようにハイパーリンクで表示されるようになる。

URL、メール・アドレス型はハイパーリンクとして表示

 なお、EmailAddress型、Url型の表示レイアウトは、それぞれフィールド・テンプレートEmailAddress.ascx、Url.ascxで定義されている。

(3)列挙体対応のフィールド・テンプレート

 もう1つ、特殊なフィールド・テンプレートとして、Enumeration.ascx/Enumeration_Edit.ascxも追加されている。これらのフィールド・テンプレートを利用することで、フィールド値に列挙体を割り当てることができる。

 例えば、以下はBookテーブルのPublishフィールドに、PublishType列挙体を割り当てている例である。

using System.ComponentModel.DataAnnotations;

namespace DynamicCs
{
  [MetadataType(typeof(BookMetadata))]
  public partial class Book { }

  public class BookMetadata
  {
    // publishフィールドにPublishType列挙体を割り当て
    [EnumDataType(typeof(PublishType))]
    public int publish;
  }

  public enum PublishType {
    翔泳社,
    秀和システム,
    技術評論社,
  }
}
<MetadataType(GetType(BookMetadata))>
Partial Public Class Book

End Class

Public Class BookMetadata
  ' publishフィールドにPublishType列挙体を割り当て
  <EnumDataType(GetType(PublishType))>
  Public publish As Integer
End Class

Public Enum PublishType
  翔泳社
  秀和システム
  技術評論社
End Enum
列挙体PublishTypeをpublishプロパティに割り当てるコード(上:Book.cs、下:Book.vb)

 列挙体を割り当てるには、対応するプロパティをEnumDataType属性で修飾すればよいだけだ。なお、EnumDataType属性を適用するフィールドは、列挙体の値を格納できるようint型としておく必要がある。

列挙体のメンバが選択値として表示される

(4)データの表示方法をより細かくカスタマイズ可能に

 データの表示方法をカスタマイズするための、Display属性が追加された。従来からのDisplayName属性(表示名)をより汎用的にした属性といえるだろう。

 具体的には、下記の表のようなプロパティを指定できる。

プロパティ 概要
AutoGenerateField フィールドを表示するか
AutoGenerateFilter フィールドのフィルタを表示するか
Description 説明テキストを表示するか
GroupName グループ化に使用する名前
Name 表示名
Order 列の表示順序
Prompt 透かし文字を表すテキスト
ResourceType ShortName、Name、Prompt、Descriptionのリソース型
ShortName 一覧表で利用される短い表示名
Display属性の主なプロパティ

 例えば、以下は表示名(一覧/詳細)と、表示順序を定義した例である。

public class BookMetadata
{
  [Display(Name="ISBNコード",ShortName="ISBN", Order=1)]
  public string isbn;

  [Display(Name = "書名", Order = 2)]
  public string title;

  [Display(Name = "価格(税込)", ShortName="価格", Order = 3)]
  public int price;

  [Display(Name = "出版社", Order = 4)]
  [EnumDataType(typeof(PublishType))]
  public int publish;

  [Display(Name = "刊行日", Order = 5)]
  public DateTime published;

  [Display(Name = "CD-ROM添付", ShortName = "CD", Order = 6)]
  public bool cdrom;
}
Public Class BookMetadata
  <Display(Name:="ISBNコード", ShortName:="ISBN", Order:=1)>
  Public isbn As String

  <Display(Name:="書名", Order:=2)>
  Public title As String

  <Display(Name:="価格(税込)", ShortName:="価格", Order:=3)>
  Public price As Integer

  <Display(Name:="出版社", Order:=4)>
  <EnumDataType(GetType(PublishType))>
  Public publish As Integer

  <Display(Name:="刊行日", Order:=5)>
    Public published As DateTime

  <Display(Name:="CD-ROM添付", ShortName:="CD", Order:=6)>
  Public cdrom As Boolean
End Class
フィールドの表示名と表示順序を指定したコード(上:Book.cs、下:Book.vb)

 以下の実行結果画面を見ると、確かに、対応する項目に指定された表示名や順序が適用されていることが確認できる。

Display属性を指定した結果

 新しい機能ということで、筆者の周辺を見る限り、本格的に活用している例はまだまだ少ないように見えるが、Dynamic Dataは習得のハードルが低い割に、適所で利用すれば工数短縮の効果は大きいソリューションだ。バージョン・アップしてより使いやすくなったこの機会に、ぜひとも一度触れてみることをお勧めしたい。

 以上、本特集では前・後編にわたって、ASP.NET 4で追加された機能の中でも特に注目すべき点にフォーカスして概説した。これらの変更点をひと言でまとめるとするならば、ずばり「クライアント開発への対応」といえるだろう。

 従来、サーバサイドに閉じた開発を目指してきたASP.NETが、ASP.NET 3.5(ASP.NET AJAX)でクライアントサイド開発への一歩を踏み出し、そして、ASP.NET 4で本格的な道を歩み始めた。新たな可能性の扉を自ら押し開いたASP.NETに、今度ますます注目だ。End of Article

 

 INDEX
  [特集]ASP.NET 4概説(前編)
  ASP.NET開発者のためのVisual Studio 2010新機能
    1.Visual Studio 2010の新機能
    2.サーバ・コントロールの新機能
    3.クライアントサイド開発の変更点
 
  [特集]ASP.NET 4概説(後編)
  ASP.NET 4/ASP.NET MVC/Dynamic Dataの新機能
    1.ASP.NET 4コアの新機能
    2.ASP.NET MVCの新機能
  3.ASP.NET Dynamic Dataの新機能


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間