.NET TIPS [ASP.NET]サイト内に複数のサイトマップ・ファイルを設置するには?[2.0のみ、C#、VB]山田 祥寛2006/10/13 |
|
|
「TIPS:[ASP.NET]サイトマップ・ファイルをローカライズするには?」でも紹介したように、グローバル・リソース・ファイルを利用することで、サイトマップ・ファイルの内容をローカライズできる。ただし、前掲のTIPSでも触れたようにサイトマップ・ファイルでローカライズできるのはTitle/Description/カスタム属性に限定され、Url属性をローカライズすることはできない。つまり、ロケールによってリンク先のページも振り分けたいという場合には、サイトマップ・ファイルそのものを分ける必要がある。
そこで本稿では、1つのサイト内で複数のサイトマップ・ファイルを設置する方法を紹介するとともに、ユーザーのロケールに基づいて、使用するサイトマップ・ファイルを動的に変更するコードについて解説する。
日本語カルチャのWebフォームの実行結果 |
多言語対応したTreeViewコントロールを日本語カルチャで表示したところ。 |
英語カルチャのWebフォームの実行結果 |
多言語対応したTreeViewコントロールを英語カルチャで表示したところ。上記画面と同じURLにもかかわらず、IEのステータス・バーに着目するとリンク先が「kisop.aspx」ではなく「kisop_en.aspx」となっていることが確認できる。 |
それではさっそく、具体的な設置の手順を見ていくことにしよう。
1. ロケールごとのサイトマップ・ファイルを用意する
まずはロケールごとのサイトマップ・ファイルを仮想ディレクトリ直下に配置する。ここでは、日本語ロケール用のサイトマップ・ファイルとしてWeb1.sitemapを、英語ロケール用のサイトマップ・ファイルとしてWeb2.sitemapを用意するものとする。
|
|
日本語ロケール用のサイトマップ・ファイル(Web1.sitemap) |
|
|
英語ロケール用のサイトマップ・ファイル(Web2.sitemap) |
2. サイトマップ・ファイルをアプリケーションに登録する
1で作成したサイトマップ・ファイルを利用するには、アプリケーション構成ファイル(Web.config)に対して、それぞれのサイトマップ・ファイル対応のサイトマップ・プロバイダ(サイトマップ情報にアクセスするためのクラス)を追加する必要がある。
|
|
複数のサイトマップ・ファイルを登録するアプリケーション構成ファイル(Web.config) |
サイトマップ・プロバイダを登録するのは、<siteMap>/<providers>/<add>要素の役割だ。<add>要素のname属性にはプロバイダを識別するための名前を、type属性にはプロバイダ・クラスを、siteMapFile属性には読み込むべきサイトマップ・ファイルを、それぞれ指定すればよい。
ここでプロバイダ・クラス(type属性)として指定しているSystem.Web.XmlSiteMapProviderクラスは、ASP.NET既定のサイトマップ・プロバイダだ。標準的な形式のサイトマップ・ファイルを読み込む場合には、固定でSystem.Web.XmlSiteMapProviderを指定しておけばよい(カスタムのサイトマップ情報を読み込ませたい場合には、独自の派生クラスを指定することも可能)。
以上の設定で、Web1.sitemapを読み込むJaSiteMapProvider、Web2.sitemapを読み込むEnSiteMapProviderを、それぞれアプリケーションから利用できるようになる。
[参考] | |||
ちなみに、以下は最上位のWeb.config(「C:\WINDOWS\Microsoft.NET\Framework\v<バージョン番号>\CONFIG」ディレクトリにある)で定義されている<siteMap>要素の内容だ。
個別のアプリケーションで特にサイトマップ・プロバイダの設定を変更しない場合には、本設定が適用され、サイトマップ・ファイルとしてweb.sitemapが読み込まれる。 |
3. サイトマップ・プロバイダを動的に変更する
以上で、サイトマップ・プロバイダ(ファイル)の準備は完了だ。最後に、これらサイトマップ・プロバイダをユーザー・ロケールに応じて切り替え、TreeViewコントロールに適用するコードを見てみよう。
まずは、フォーム・デザイナから以下のようなページを用意してほしい(ナビゲーション・コントロールの利用方法については、「TIPS:[ASP.NET]Webフォーム上でサイト・メニュー/サイト・パスを作成するには?」が詳しいので、そちらを参照いただきたい)。
Webフォーム(C#:SiteMapLocal_cs.aspx/VB:SiteMapLocal_vb.aspx)のフォーム・レイアウト | ||||||
TreeViewコントロールに適用するコードで使用するWebフォームをレイアウトしているところ。 | ||||||
|
ページのロード時に実行されるイベント・ハンドラのコードは以下のとおり。
|
|
ユーザー・ロケールに応じて対応するプロバイダを選択する処理(C#版:SiteMapLocal_cs.aspx.cs) |
|
|
ユーザー・ロケールに応じて対応するプロバイダを選択する処理(VB版:SiteMapLocal_vb.aspx.vb) |
使用するプロバイダを切り替えるには、SiteMapDataSourceコントロール(smds)のSiteMapProviderプロパティに2で指定したプロバイダ名をセットすればよい(SiteMapPathコントロールを使用している場合には、SiteMapPath.SiteMapProviderプロパティ)。
以上を理解したら、さっそくここまでに作成したサンプル・プログラムを実行してみよう。ブラウザの言語設定によって、冒頭のような結果が得られれば成功だ。なお、IEの場合の言語設定は、メニューバーの[ツール]−[インターネット オプション]を選択して[インターネット オプション]ダイアログを表示し、そのダイアログの[全般]タブにある[言語]ボタンから変更できる。
利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Webフォーム 処理対象:サイトマップ 使用キーワード:@ Pageディレクティブ 使用キーワード:<siteMap>要素 使用ライブラリ:XmlSiteMapProviderクラス(System.Web名前空間) 関連TIPS:[ASP.NET]サイトマップ・ファイルをローカライズするには? 関連TIPS:[ASP.NET]Webフォーム上でサイト・メニュー/サイト・パスを作成するには? |
「.NET TIPS」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|