読者です 読者をやめる 読者になる 読者になる

きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

ASP.NET 4.5 Web Formの『強く型指定されたデータコントロール(Strong Typed Data Controls)』を試してみる

本エントリは、One ASP.NET Advent Calendar 2012の3日目の記事です。
前日のエントリは@さんのASP.NET Web API のトレース機能を使ってみる です。

『強く型指定されたデータコントロール(Strong Typed Data Controls)』とは?

2012年のリリースされたVisual Studio 2012と.NET Framework 4.5。ASP.NETも4.5になりました。同時にバージョン4.5となったASP.NETではASP.NET MVC 4やWeb APIについて話題になっているのをよく目にします。しかし、あまり(特に日本では)言及されているところを見ないのですが、Web Formもいくつか機能強化されています。

ASP.NET Web Forms 4.5の新フィーチャーの一覧は、下記のサイトの『ASP.NET Web Forms』配下のリストで確認できます。
What's New in ASP.NET 4.5 and Visual Studio 2012 : The Official Microsoft ASP.NET Site


今回上記リストで最初にリストアップされているフィーチャー、『強く型指定されたデータコントロール(Typed Data Controls)*1』を試してみたいと思います。

例…の前に前提

今回は例として、以下のようなエンティティクラスUserEntityのListをRepeaterコントロールにバインドするケースを上げてみたいと思います。

public class UserEntity
{
  public int ID { get; set; }
  public string FirstName { get; set; }
  public string FamilyName { get; set; }
  public int Age { get; set; }
}

これをRepeaterコントロールのDataSourceにコード上から、以下のようにバインドすることを想像してください。

private void BindRepeater()
{
  var item = new List<UserEntity>();
  item.Add(new UserEntity() { ID = 1, FirstName = "トロ", FamilyName = "井上", Age = 19 });
  item.Add(new UserEntity() { ID = 2, FirstName = "ジュン", FamilyName = "三原", Age = 20 });
  item.Add(new UserEntity() { ID = 3, FirstName = "ピエール", FamilyName = "山本", Age = 20 });

  this.Repeater1.DataSource = item;
  this.Repeater1.DataBind();
}

従来の型指定のないデータバインド

従来の場合、コントロールにデータをバインドする際、以下のようにEval(一方向バインディング)やBind(双方向バインディング)を使って指定しました。
例えば以下の形です。

<ul>
<asp:Repeater ID="Repeater1" runat="server">
  <ItemTemplate>
    <li>
      <%#: Eval("Age") %>
      <ul>
        <li><asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("FirstName") %>'></asp:TextBox></li>
        <li><asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("FamilyName") %>'></asp:TextBox></li>
      </ul>
    </li>
  </ItemTemplate>
</asp:Repeater>
</ul>

これはこれで楽チン…ではあるのですが、見ておわかりの通り、バインド対象のオブジェクトのメンバを文字列で指定しています*2。ですので、たとえばタイプミス等による間違いを検出するタイミングが往々にして実行時エラーになりがちですし、コーディング時にインテリセンスのサポートが無いことなどの難点もあります。

ASP.NET 4.5のStrong Typed Data Controls

今回ASP.NET 4.5では、Repeater/GridView/DetailsView/FormView/ListView等のデータ系のサーバコントロールに、バインドする型の情報を指定するItemTypeプロパティが追加されました。
実際に、例を見てみてください。

<ul>
<asp:Repeater ID="Repeater1" runat="server" ItemType="ModelBindingSampleWeb.UserEntity">
  <ItemTemplate>
    <li>
      <%#: Item.Age %>
      <ul>
        <li><asp:TextBox ID="TextBox1" runat="server" Text='<%# BindItem.FirstName %>'></asp:TextBox></li>
        <li><asp:TextBox ID="TextBox2" runat="server" Text='<%# BindItem.FamilyName %>'></asp:TextBox></li>
      </ul>
    </li>
  </ItemTemplate>
</asp:Repeater>
</ul>

ItemType属性で型を指定し、Eval("hoge")はItem.Hoge 、Bind("Hoge")はBindItem.Hoge となっていることに注目してください。

こうすると、下記のようにItemまたはBindItemのメンバとしてインテリセンスが効くようになります。これはうれしい。

また、タイプミスなどにより存在しない識別子を指定した時も、デザイナ上で赤波線が引かれ視覚的にミスを指摘してくれるようになります*3


さて、明日は…

本当に軽い紹介になりましたが、ちょとした変更ではあるものの、コーディング時にインテリセンスが効きエラーが視覚的に表示されるだけでも、かなり便利なると思います。ASP.NET 4.5でWeb Formの開発を行う際にはぜひ、検討してみてください。


明日、12/4の担当は高野将さんです。よろしくお願いします!

*1:翻訳が合ってるのかわかりません。…公式な?翻訳記事が見当たらなかったので…。

*2:内部的には恐らくリフレクション等を使っているのだと思います

*3:ただし、どうやらコンパイルエラーにはならない様子。できればコンパイルエラーにもして欲しいところですが…