連載

ASP.NET 2.0が変えるWebアプリ開発の世界

第6回 ASP.NET 2.0の検証コントロール

山田 祥寛
2005/01/19
Page1 Page2

○エラー時にフォーカスを自動セットするSetFocusOnError属性

 ASP.NET 2.0の検証コントロールには、もう1つ重要な変更点がある。それは、エラーが発生した場合に該当のフォーム要素にフォーカスを自動セットするための「SetFocusOnError属性」が追加されたことだ。

 エラーが発生した場合、該当のフォーム要素に対してあらかじめフォーカスがセットされていれば、ユーザーはエラーが表示された時点ですぐにデータの修正を行える。そのため、ユーザビリティという観点からも同等の仕組みを実装しているサイトは多いのではないだろうか。しかし、このような当たり前のことすら、ASP.NET 1.xで実現するにはクライアントサイド・スクリプトを含む煩雑なコーディングを必要とした(詳細については、.NET TIPS「[ASP.NET]コントロールにフォーカスをセットするには?」が詳しいので、こちらを併せて参照いただきたい)。

 そこで登場するのが、SetFocusOnError属性だ。先ほどのvalid.aspx上に配置された3つの検証コントロールそれぞれに対してSetFocusOnError属性をTrueにセットしてみよう。もう一度、valid.aspxを実行してみると、次の画面のようにエラーになった項目(ここでは[E-Mail]欄)に、自動的にカーソルがセットされているのが確認できるはずだ。

SetFocusOnError属性にTrueを設定した場合
[購読取消]ボタンをクリックすると、必須入力エラーとなった[E-Mail]欄にカーソルがセットされる。

●キャッシュを部分的に無効にするSubstitutionコントロール

 ASP.NETにはさまざまなキャッシュ技術が用意されているが、その中でもフラグメント・キャッシュは特徴的なキャッシュ技術の1つだ。詳細は、.NET TIPS「[ASP.NET]Webフォーム・ページの一部分を断片的にキャッシングするには?」をご覧いただきたいが、フラグメント・キャッシュとは要はページの断片(フラグメント)単位に、異なるキャッシュ・ルールを定めることで、コンテンツの内容に即したより効率的なキャッシングを可能にする。

 従来、ASP.NET 1.xでは、キャッシュを利用したページの中でほんの一部分だけダイナミックな情報を出力したいという場合にも、わざわざユーザー・コントロールを定義する必要があった(さもなければ、ページ全体でキャッシュを無効にするしかなかった)。しかし、出力する対象がごく単純な文字列である場合、いちいちユーザー・コントロールとして外部化することは、かえってアプリケーションの管理を煩雑にする原因になる。

 そこでASP.NET 2.0で新たに登場したのが、「Substitutionコントロール」だ。Substitutionコントロールを利用することで、ページ上で設定されたキャッシュ・ポリシーにかかわらず、Substitutionコントロールで定義された部分だけは常にダイナミックにコンテンツを生成できる。

 さっそく、具体的な例を見てみよう。まずは、フォーム・デザイナ上に下記のようにコントロールを配置してみよう。

substitution.aspxの配置
  Labelコントロール(lbl)。
  Substitutionコントロール(sbt)。

 Substitutionコントロールはとても単純なコントロールだ。[プロパティ]ウィンドウからMethodNameプロパティに、Substitutionコントロールから呼び出されるメソッドの名前を指定するだけでよい(ここでは、仮に「GetCurrent」と指定しておく)。Substitutionコントロールは、自分自身が呼び出されるたびにMethodNameプロパティで指定されたメソッドを呼び出し、そのメソッドから返された文字列を「常に動的に」出力するというわけだ。

 後は、コード・エディタで以下のようなコードを記述すればよい。Page_Loadイベント・ハンドラではLabelコントロールに、GetCurrentプロシージャではSubstitutionコントロールに、それぞれ現在時刻を出力するものとする。@OutputCacheディレクティブに関しては、.NET TIPS「[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?」が詳しいので、併せて参照するとよい。

<%@ OutputCache VaryByParam="none" Duration="120" %>
<script runat="server">
Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  lbl.Text = DateTime.Now.ToString()
End Sub
Shared Function GetCurrent(ByVal context As HttpContext) As String
  Return DateTime.Now.ToString()
End Function
</script>
キャッシュされたWebページの一部分を動的に出力するためのサンプル・プログラム(substitution.aspx)

 substitution.aspxを実行してみると、以下のような結果を得ることができる。

substitution.aspxの実行結果(時間を置いてから表示をリフレッシュ)
2回目のアクセスでは、Substitutionコントロール上の時刻だけが更新されていることが確認できる。

 初回アクセス時には、Labelコントロール、Substitutionコントロールともに同じ時刻が表示されているが、リフレッシュしてみると、Substitutionコントロールの時刻だけが(キャッシュ・ルールにかかわらず)更新されているのが確認できるだろう。

 以上5回に分けて、ASP.NET 2.0で追加/拡張された主要なサーバ・コントロールの機能について見てきた。1つ1つを見ていけば、必ずしもASP.NET 1.xでも「絶対にできなかったこと」ではない。しかし、ASP.NET 1.xでは自らプログラムをコーディングしなければならなかったため、アプリケーション開発者の手を煩わせていた――あるいは、煩雑であるため頓挫していた処理が、ASP.NET 2.0ではほとんどプログラムレスで済むようになっている。ASP.NET 1.xで「かゆかった」ところにまで手を伸ばしたバージョン。それがASP.NET 2.0であるといえるだろう。

 さて次回からは、サーバ・コントロール以外のASP.NET 2.0の変更点について紹介する。サイト・デザインを一元的に管理するための「テーマ」や「スキン」、プロファイル機能を用いたパーソナライゼーション、そして、ポストバックのオーバーヘッドを軽減するクライアント・コールバックなどなど、次回も盛りだくさんの内容になる予定だ。どうぞお楽しみに。End of Article


 INDEX
  ASP.NET 2.0が変えるWebアプリ開発の世界
  第6回 ASP.NET 2.0の検証コントロール
    1.ValidationGroup属性による検証コントロールのグループ化
  2.エラー時にフォーカスを自動セットするSetFocusOnError属性
 
インデックス・ページヘ  「ASP.NET 2.0が変えるWebアプリ開発の世界」


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

本日 月間