連載

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

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

山田 祥寛
2005/04/27
Page1 Page2 Page3

●Headerプロパティでページ単位のメタ情報を管理する

 SEO(検索エンジン最適化)という観点では、<title>タグや<meta>タグのKeyword属性、Description属性に適切な値をセットしておくことは重要なポイントの1つだ。多くのページを個別に管理していると、思わず抜けがちになるこういった情報も、データベース化することでより厳密に管理できるようになる。

 しかし、このようなアプリケーション開発にとっては、ごく当たり前ともいえるこのような作業を行うにも、ASP.NET 1.xではややトリッキーな操作を行う必要があった(例えば、.NET TIPS「[ASP.NET]アプリケーション共通のヘッダ/フッタを追加するには?」でも実現の一例を示しているので、興味のある方は併せて参照していただきたい)。このような作業も、ASP.NET 2.0で導入されたPage.Headerプロパティを利用することで、より直感的に行うことが可能になる。

 例えば、第2回で登場したマスター・ページ(.masterファイル)上で以下のようなコードを記述してみよう。なお、以下のサンプル・プログラムを実行するには、Wingsデータベースに対して、ページ情報を管理するためのpageInfoテーブルをあらかじめ用意しておく必要がある。

フィールド名 データ型 概要
url VARCHAR(100) URL(主キー)
title VARCHAR(255) ページ・タイトル
keywords VARCHAR(100) カンマ区切りのキーワード
description VARCHAR(255) ページの詳細情報
ページ情報管理用のpageInfoテーブルのフィールド・レイアウト
以下のサンプル・プログラムを実行するには、Wingsデータベースに対して、このようなpageInfoテーブルを、事前に用意しておく必要がる。

 また、作成したテーブル内にテスト用のデータとして、仮に以下のデータを入力しておく。

フィールド名 データ
url /asp20/meta.aspx
title 共通ヘッダ/フッタを付加する
keywords マスター・ページ,Header
description 共通ヘッダ/フッタをアプリケーションの全ファイルに付加
ページ情報管理用のpageInfoテーブルのテスト用データ
作成したpageInfoテーブル内に、テスト用のデータとして、このようなデータを仮に入力しておく必要がある。
 
<script runat="server">
Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  Dim objDb As New SqlConnection("Server=(local);User ID=sa;Password=sa;Database=wings;Persist Security Info=True")
  Dim objCom As New SqlCommand("SELECT * FROM pageInfo WHERE url=@url", objDb)
  objCom.Parameters.AddWithValue("@url", Request.RawUrl)
  objDb.Open()
  Dim objDr As SqlDataReader = objCom.ExecuteReader()
  If objDr.Read() Then
    Page.Header.Title = objDr.GetString(1)
    Page.Header.Metadata.Add("keyword", objDr.GetString(2))
    Page.Header.Metadata.Add("description", objDr.GetString(3))
  End If
  objDb.Close()
End Sub
</script>
メタデータ設定用のマスター・ページ(meta.master)
<title>タグや<meta>タグのKeyword属性、Description属性を管理するために、このようなマスター・ページのコードを記述する。

 このコードでポイントとなるのは、データベースから読み込んだデータをPage.Headerプロパティに設定している3行だ。

 あとは、マスター・ページを適用するためのmeta.aspxというファイルを作成すればよい。ここで注目したいのはあくまでマスター・ページの内容なので、meta.aspxの中身は何でも構わない。

 meta.aspxを実行し、ブラウザの[ソースの表示]から出力されたHTMLコードを確認してみよう。以下のように、<head>タグの中に、動的に生成された<title>タグや<meta>タグが出力されていることが確認できるはずだ(読みやすさを考慮して、コードには適宜、改行を追加している)。

<head>
  <title>共通ヘッダ/フッタを付加する</title>
  <meta name="keyword" content="マスター・ページ,Header" />
  <meta name="description" content="共通ヘッダ/フッタをアプリケーションの全ファイルに付加" />
</head>
マスター・ページが適用されたWebフォーム(meta.aspx)の実行結果
マスター・ページの内容が適用されて、<title>タグや<meta>タグのKeyword属性、Description属性などの情報が付加される。

●<%$〜%>構文で国際化機能をスクリプトレスで実現する

 昨今、1つのサイト(Webアプリケーション)で2つ以上の言語に対応したいというニーズは珍しくない。特にビジネス用途において、その傾向は顕著だ。Webサイトがますますビジネス密着のものとなり、対象となる顧客層も拡大する中、最低でも日本語/英語、場合によっては中国語/フランス語など多言語に対応しなければならない状況は、日に日に増大している。

 このような多言語対応を前提としたWebサイトでは、言語に依存した情報をWebページ内に直接記述することは好ましくない。例えば、コード中に日本語をそのまま記述してしまったら、将来的に英語版のサイトを追加しようとした場合には、日本語部分だけを英語に置き換えたまったく同じコードをもう1つ用意しなければならないからだ。もしもさらに中国語のページが増えたとしたら、同じく中国語にのみ置き換えた同一のコードを用意しなければならない。要は、対応する言語の数だけ管理すべきコードも肥大化していくのだ。

 多言語対応のサイトを構築するために、ASP.NET 1.xでも言語依存要素をリソース・ファイルとして管理する方法が提供されていた。しかし、リソース・ファイルの内容を出力するために少なからぬコードを記述しなければならないという意味で、ASP.NET 1.xの国際化機能はまだ原始的であったといってよい(詳細な手法は、.NET TIPS「[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?」を参照いただくとよいだろう)。もしもこのような定型的な処理のために、コードを記述するのを嫌うならば、.NET TIPS「[ASP.NET]国際化対応サイトをプログラムレスで実現するには?」でも紹介しているように、自前でカスタム・コントロールを用意する必要があったのだ。

 しかし、ASP.NET 2.0ではリソース・ファイルをWebフォーム上で引用するための標準的な方法が提供されている。これによって、先に示した別稿のようなコード、またはカスタム・コントロールを用意する必要がなくなる。

 それではさっそく、具体的なコード例を見てみることにしよう。ここで紹介するサンプル・プログラムはとても単純なものだ。IEなどブラウザの言語設定を日本語、英語と切り替えたときに、それぞれ下図のように表示言語も動的に変更する。

英語カルチャーのWebフォームの実行結果
多言語対応したWebフォームを英語カルチャで表示したところ。
 
日本語カルチャーのWebフォームの実行結果
多言語対応したWebフォームを日本語カルチャで表示したところ。

 なお、IEの場合の言語設定は、メニューバーの[ツール]−[インターネット オプション]を選択して[インターネット オプション]ダイアログを表示し、そのダイアログの[全般]タブにある[言語]ボタンから変更できる。

○リソース・ファイルを作成する

 Visual Studio 2005上では、専用のデータ・シート上でリソース・ファイルを編集することができる。ソリューション・エクスプローラから[新しい項目の追加]を選択し、新規に「national.aspx.resx」「national.aspx.ja.resx」という名前でファイルを作成しておこう。

 そして、ASP.NET 2.0でリソース・ファイルを利用する場合には、以下の2点に従う必要がある。

  • ファイル名は「Webフォーム名[.カルチャ名].resx」
  • 配置先は、仮想ディレクトリ配下の「LocalResources」フォルダ
[注意]

ただし、「LocalResources」フォルダは.NET Framework 2.0 ベータ1における名前だ。ベータ2では、「app_localresources」に改められている。また、ここでは個別のページから引用するリソースであることを前提に紹介を進めるが、アプリケーション全体で共有したいリソースは、「Resources(ベータ2では、app_globalresources)」フォルダに格納する必要がある。その場合、ファイル名は「ベース名[.カルチャ名].resx」の形式で命名することができる。ベース名は、リソース・ファイルを識別するための任意の名前だ。

 つまり、リソース・ファイルの内容をnational.aspxから利用したい場合には、「national.aspx.〜」で始まるファイル名を付ける必要がある。

 カルチャ名は、中身のリソースがどのロケール/国に属するかを表すためのキーで、例えば「ja」であれば日本語を表し、「en」であれば「英語」を意味する。ハイフン区切りで、「ja-JP(日本語[日本])」のように言語/国を表現することもできる。ASP.NETでは、実行時にクライアントのカルチャ情報とリソース・ファイルのカルチャ名とを比較することで、リソースを動的に選択するというわけだ。ちなみに、カルチャ名が明示されないリソース・ファイルは、デフォルトのリソースであると見なされ、クライアントの環境に合致するリソースが見つからなかった場合に最終的に採用される。

 さて、リソース・ファイルを新規作成すると、以下のようなデータ・シートが表示されるはずだ。

リソース・ファイルの編集画面
リソース・ファイルで管理するデータは、このようなデータ・シート上から簡単に編集できる。

 それぞれのリソース・ファイルには、以下の表に従ってbodyというキーのリソースを作成しておこう。

ファイル名 キー名
national.aspx.resx body This is sample.
national.aspx.ja.resx これはサンプルです。
リソース・ファイルにセットする値(例)

○リソース・ファイルを引用するWebフォーム・ページを作成する

 リソース・ファイルが用意できたところで、次にリソース・ファイルを引用するための簡単なWebフォーム・ページを用意する。

国際化機能確認用のWebフォーム(national.aspx)
リソース・ファイルを引用するための簡単なWebフォームを用意する。

 ここで注目していただきたいのは、LiteralコントロールのTextプロパティだ。リソース・ファイルの内容にアクセスするには、プロパティ・ウィンドウから以下のような式を入力する必要がある。

<%$ Resources: body %>

 リソース式の一般的な構文は以下のとおりだ。

<%$ Resources: 引用したいキー名 %>

 また、コード・エディタから@Pageディレクティブに以下のような記述を追加する必要がある。

<%@ Page Language="VB" Culture="auto" UICulture="auto" %>

 Culture属性、UICulture属性は、それぞれアプリケーション、ユーザー・インターフェイスで採用されるカルチャを定義するものだ。値として“auto”を設定した場合には、ASP.NETがリクエスト情報に含まれるAccept-Languageヘッダの内容から判断して、自動的にカルチャを特定してくれる。

 以上の設定ができたところで、さっそく、national.aspxを実行して、リソース・ファイルを引用できることを確認してみよう。本節冒頭のように、クライアント側の言語設定によって、表示される画面が切り替われば成功だ。ただし、言語設定を変更した場合には、一度、ブラウザを閉じなければ設定が正しく反映されないので注意すること。

 それでは最後に、本連載の締めくくりとして、ノータッチ・デプロイメントの強化版である「ClickOnce」について紹介しよう。


 INDEX
  ASP.NET 2.0が変えるWebアプリ開発の世界
  第9回 ASP.NET 2.0が変えるWebアプリ開発の世界
    1.ページ間ポストバックとClientClickイベント
  2.IPageHeaderオブジェクトと国際化対応の機能
    3.強化版ノータッチ・デプロイメント「ClickOnce」
 
インデックス・ページヘ  「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 記事ランキング

本日 月間