.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を用意するものとする。

<?xml version="1.0" encoding="UTF-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode title="ホーム"
    description="トップページ" url="default.aspx">
    <siteMapNode title="新刊書籍情報"
        description="サーバサイド技術に関する書籍の最新情報" url="books.aspx">
      <siteMapNode title="改訂新版 基礎PHP"
        description="PHP 5.0を基礎から学ぶのに最適" url="kisop.aspx" />
      <siteMapNode title="独習ASP.NET"
          description="ASP.NETを独りで学ぶ 入門書の定番" url="aspnet.aspx" />
    </siteMapNode>
  </siteMapNode>
</siteMap>
日本語ロケール用のサイトマップ・ファイル(Web1.sitemap)
 
<?xml version="1.0" encoding="UTF-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode title="Home"
    description="This is top page" url="default_en.aspx">
    <siteMapNode title="What's New!"
      description="About new books about server side tech" url="books_en.aspx">
      <siteMapNode title="Basic PHP"
        description="Learning PHP5" url="kisop_en.aspx" />
      <siteMapNode title="Teach Yourself AspDotNet"
          description="Can teach yourself AspDotNet" url="aspnet_en.aspx" />
    </siteMapNode>
  </siteMapNode>
</siteMap>
英語ロケール用のサイトマップ・ファイル(Web2.sitemap)

2. サイトマップ・ファイルをアプリケーションに登録する

 1で作成したサイトマップ・ファイルを利用するには、アプリケーション構成ファイル(Web.config)に対して、それぞれのサイトマップ・ファイル対応のサイトマップ・プロバイダ(サイトマップ情報にアクセスするためのクラス)を追加する必要がある。

<?xml version="1.0" ?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <system.web>
  ……中略……
  <siteMap enabled="true">
    <providers>
      <add name="JaSiteMapProvider"
        type="System.Web.XmlSiteMapProvider" siteMapFile="Web1.sitemap" />
      <add name="EnSiteMapProvider"
        type="System.Web.XmlSiteMapProvider" siteMapFile="Web2.sitemap" />
    </providers>
  </siteMap>
  ……中略……
  </system.Web>
</configuration>
複数のサイトマップ・ファイルを登録するアプリケーション構成ファイル(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>要素の内容だ。

……前略……
<siteMap>
  <providers>
    <add siteMapFile="web.sitemap" name="AspNetXmlSiteMapProvider"
      type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</siteMap>
……後略……
最上位のWeb.configで定義されている<siteMap>要素の内容

 個別のアプリケーションで特にサイトマップ・プロバイダの設定を変更しない場合には、本設定が適用され、サイトマップ・ファイルとしてweb.sitemapが読み込まれる。

3. サイトマップ・プロバイダを動的に変更する

 以上で、サイトマップ・プロバイダ(ファイル)の準備は完了だ。最後に、これらサイトマップ・プロバイダをユーザー・ロケールに応じて切り替え、TreeViewコントロールに適用するコードを見てみよう。

 まずは、フォーム・デザイナから以下のようなページを用意してほしい(ナビゲーション・コントロールの利用方法については、「TIPS:[ASP.NET]Webフォーム上でサイト・メニュー/サイト・パスを作成するには?」が詳しいので、そちらを参照いただきたい)。

Webフォーム(C#:SiteMapLocal_cs.aspx/VB:SiteMapLocal_vb.aspx)のフォーム・レイアウト
TreeViewコントロールに適用するコードで使用するWebフォームをレイアウトしているところ。
  TreeViewコントロール(IDは「tree」)。
  SiteMapDataSourceコントロール(IDは「smds」)。

 ページのロード時に実行されるイベント・ハンドラのコードは以下のとおり。

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class SiteMapLocal_cs : System.Web.UI.Page {
  protected void Page_Load(object sender, EventArgs e) {
    if (Request.UserLanguages(0).StartsWith("ja")) {
      // ロケールが“ja”の場合には“JaSiteMapProvider”をセット
      smds.SiteMapProvider = "JaSiteMapProvider";
    } else if(Request.UserLanguages(0).StartsWith("en")) {
      // ロケールが“en”の場合には“EnSiteMapProvider”をセット
      smds.SiteMapProvider = "EnSiteMapProvider";
    } else {
      // ロケールが“ja”、“en”いずれでもない場合には
      // “EnSiteMapProvider”をセット
      smds.SiteMapProvider = "EnSiteMapProvider";
    }
  }
}
ユーザー・ロケールに応じて対応するプロバイダを選択する処理(C#版:SiteMapLocal_cs.aspx.cs)
 
Partial Class SiteMapLocal_vb
  Inherits System.Web.UI.Page
  Protected Sub Page_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Me.Load
    If Request.UserLanguages(0).StartsWith("ja") Then
      ' ロケールが“ja”の場合には“JaSiteMapProvider”をセット
      smds.SiteMapProvider = "JaSiteMapProvider"
    ElseIf Request.UserLanguages(0).StartsWith("en") Then
      ' ロケールが“en”の場合には“EnSiteMapProvider”をセット
      smds.SiteMapProvider = "EnSiteMapProvider"
    Else
      ' ロケールが“ja”/“en”いずれでもない場合には
      ' “EnSiteMapProvider”をセット
      smds.SiteMapProvider = "EnSiteMapProvider"
    End If
  End Sub
End Class
ユーザー・ロケールに応じて対応するプロバイダを選択する処理(VB版:SiteMapLocal_vb.aspx.vb)

 使用するプロバイダを切り替えるには、SiteMapDataSourceコントロール(smds)のSiteMapProviderプロパティに2で指定したプロバイダ名をセットすればよい(SiteMapPathコントロールを使用している場合には、SiteMapPath.SiteMapProviderプロパティ)。

 以上を理解したら、さっそくここまでに作成したサンプル・プログラムを実行してみよう。ブラウザの言語設定によって、冒頭のような結果が得られれば成功だ。なお、IEの場合の言語設定は、メニューバーの[ツール]−[インターネット オプション]を選択して[インターネット オプション]ダイアログを表示し、そのダイアログの[全般]タブにある[言語]ボタンから変更できる。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Webフォーム 処理対象:サイトマップ
使用キーワード:@ Pageディレクティブ
使用キーワード:<siteMap>要素
使用ライブラリ:XmlSiteMapProviderクラス(System.Web名前空間)
関連TIPS:[ASP.NET]サイトマップ・ファイルをローカライズするには?
関連TIPS:[ASP.NET]Webフォーム上でサイト・メニュー/サイト・パスを作成するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET]サイトマップ・ファイルをローカライズするには?
[ASP.NET]サイトマップ・データを非階層コントロールに表示するには?
[ASP.NET]ナビゲーション・コントロールでセキュリティ・トリミング機能を有効にするには?
[ASP.NET]Webフォーム上でサイト・メニュー/サイト・パスを作成するには?
[ASP.NET]ナビゲーションAPIで前後ページへのナビゲーション・バーを作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


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

本日 月間