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

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

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

 ASP.NETアプリケーション開発者のためのVisual Studio 2010(以降、VS 2010)の新機能として、前編では開発環境、サーバ・コントロール、クライアントサイド開発という観点から概観した。

 後編となる今回では、引き続きASP.NET 4のコア機能、そして、ASP.NET MVC、Dynamic Dataなど周辺技術の新機能について解説していく。

ASP.NET 4コアの新機能

 まずは、ASP.NET 4のコア部分の変更点から見てみよう。

ユーザーフレンドリなURLを設計する ― ルーティング機能の強化 ―

 Webアプリケーションにおいて、ルーティングとは、リクエストURLとあらかじめ決められた条件設定(=ルート)に従って、実際の処理を行うページ(=クラス)を振り分ける機能のこと。ルーティングを利用することで、公開URLと、物理的なファイル構造とを分離できるため、エンド・ユーザーにとってより分かりやすいURL階層を設計できるようになる。

 もっとも、ルーティングというと、ASP.NET MVCだけの機能と思われている節もある。なるほど、ASP.NET MVCではルーティング機能がデフォルトで有効になっているが、ASP.NET 3.5では(使えはするものの)相応の準備をしないと利用できなかったし、そもそも準備のハードルは高かった。実質、ASP.NET 3.5でルーティングを利用していた諸氏はさほど多くはなかったはずだ。

 しかし、ASP.NET 4では新たにMapPageRouteメソッドが追加され、ルーティング利用のハードルは一挙に下がった。具体的なコード例を見てみよう。

using System.Web.Routing;

void Application_Start(object sender, EventArgs e)
{
  // blogルートを定義
  RouteTable.Routes.MapPageRoute("blog",
    "blog/{year}/{month}/{day}", "~/Details.aspx");
}
Imports System.Web.Routing

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
  ' blogルートを定義
  RouteTable.Routes.MapPageRoute("blog",
    "blog/{year}/{month}/{day}", "~/Details.aspx")
End Sub
Blogルートを設定するためのコード(上:Global.asax.cs、下:Globa.asax.vb)

 実にこれだけのコードで、

http://www.wings.msn.to/Blog/2010/06/25

のようなリクエストが、

~/App/Details.aspx

に振り分けられる。ルーティング先(上記の例ではDetails.aspxファイル)でルート・パラメータ(例では「/2010/06/25」の部分)を取得するのも簡単だ。下記のコードはそのコード例。

<asp:Literal ID="ltrYear" runat="server"
  Text="<%$ RouteValue:year %>" />年
<asp:Literal ID="ltrMonth" runat="server"
  Text="<%$ RouteValue:month %>" />月
<asp:Literal ID="ltrDay" runat="server"
  Text="<%$ RouteValue:day %>" />日 …… 式構文を利用した場合

Response.Write(String.Format("{0}年{1}月{2}日",
  RouteData.Values["year"],
  RouteData.Values["month"],
  RouteData.Values["day"]));  …… プログラムから取得する場合
ルート・パラメータ取得のコード(C#の場合)

 このように、式構文「<%$RouteValue:...%>」で宣言的に取得することも、RouteDataオブジェクトでプログラム的に取得することもできる。

 さらに、式構文「<%$ RouteUrl %>」を利用すれば、ルート定義に基づいて動的にURLを生成することも可能だ。以下のコードは「~/Blog/2010/06/25」へのリンクを生成するためのコード例である。

<asp:HyperLink ID="lnkRoute" runat="server"
  NavigateUrl=
    "<%$ RouteUrl:RouteName=blog,year=2010,month=6,day=25 %>">
  詳細</asp:HyperLink>
ルート定義からリンクを生成するコード

クライアントサイド開発に最適化されたクライアントID ― ClientIDModeプロパティ ―

 クライアントIDとは、クライアントに最終的に出力されるid属性のこと。ASP.NETではもともと、サーバID(=サーバ・コントロールのIDプロパティ)を基に、クライアントIDを自動生成していた。

 例えば、下の図のような例を考えてみよう。

クライアントIDの決まり方(従来)

 上の図を見ると分かるように、マスター・ページ配下のコンテンツ・ページに配置されたテキストボックスtxtNameであれば、クライアントIDは「ctl00_MainContent_txtName」となるし、ユーザー・コントロールのさらに配下のテキストボックスtxtNameであれば「ctl00_MainContent_cli_txtName」となる。クライアントIDが重複しないよう、ASP.NETが階層に応じたラベル付けを行っているわけだ。

 これは一見便利な機能に思えるが、クライアントサイド開発を難しくする原因でもある。例えば、ユーザー・コントロール配下のテキストボックスにJavaScriptコードからアクセスしようとしたら、以下のような埋め込みブロック混在のコードを記述しなければならないだろう。

$get('<%=txtName.ClientID %>')
ユーザー・コントロール配下のテキストボックスにアクセスするJavaScriptコード(従来)

 ユーザー・コントロールを設計した時点では、そもそもユーザー・コントロールのID値は決まっていないので、クライアントIDをハード・コーディングすることはできないのだ。このように、サーバ/クライアント双方のコードが混在した状態が好ましくないのはいうまでもない。

 そこでASP.NET 4では、クライアントIDの生成方法を設定するためのClientIDModeプロパティが追加されている(設定できる値は下記の表を参照)。

設定値 概要
AutoID 自動的にID値を設定(従来の形式)
Inherit 親ページ/コントロールの設定を継承
Static サーバIDで固定
Predctable ClientIDRowSuffixプロパティの値から生成
ClientIDModeプロパティの設定値

 例えば、先ほどの例であれば、テキストボックスtxtNameのClientIDModeプロパティに対して、ClientIDModeプロパティに「Static」を指定すればよい。これによって、テキストボックスtxtNameのクライアントIDは、そのまま「txtName」となる。もちろん、Staticオプションを利用した場合、アプリケーション開発者はページ全体でクライアントIDが衝突しないよう配慮する必要がある。

 Predictableオプションは、GridViewやListViewなどのリスト・コントロールで利用することを想定したオプションである(predictableは「予測可能な」という意味)。具体的には、下記のコード例を見てほしい。

<asp:GridView ID="grid" runat="server" AutoGenerateColumns="False"
    CellPadding="4"
    ClientIDMode="Predictable"
    ClientIDRowSuffix="isbn"
    DataKeyNames="isbn" DataSourceID="sds"
    ForeColor="#333333" GridLines="None">
  <Columns>
    ……中略……
    <asp:TemplateField HeaderText="title" SortExpression="title">
      <ItemTemplate>
        <asp:Label ID="lblTitle" runat="server"
          Text='<%# Bind("title") %>'></asp:Label>
      </ItemTemplate>
    </asp:TemplateField>
    ……中略……
  </Columns>
  ……中略……
</asp:GridView>
Predictableオプションの利用例

 Predictableオプションを利用する場合には、ClientIDRowSuffixプロパティも併せて指定する必要がある。ClientIDRowSuffixプロパティは、クライアントIDの接尾辞として使用するフィールドの名前を表すものだ。

 上記のコード・リスト「Predictableオプションの利用例」の例であれば、isbnフィールドが「978-4-7980-2004-4」である場合、ラベルlblTitleのクライアントIDは「grid_lblTitle_978-4-7980-2004-4」のようになる(ちなみに、ASP.NET 3.5までは「grid_ctl01_lblTitle」のようなIDが自動生成されていた)。

 このように、Predictableオプションでは、クライアントIDを自動生成するものの、予測可能な値を生成してくれるわけだ。

 続いて次のページでは、SEOの強化、さらにASP.NET MVCの新機能を説明する。


 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 記事ランキング

本日 月間