SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

ASP.NETサイトナビゲーションの9つの問題のソリューション:パート1

ASP.NET 2.0における基本的なサイトナビゲーション手法

#2:アクティブなトップレベルページの表示を差別化する

 大抵のサイトでは、サイト内での現在位置を分かりやすく示すために、アクティブなトップレベルページと非アクティブなトップレベルページの表示方法を変えています。とはいえ、「アクティブな」とはどういう意味でしょうか? トップレベルページだけに限らず、アクティブなページは、現在のページと直接的な関係を持っています。例えば、図1の「Home」ページの色は青ではなく白になっています。これは、「Home」ページは「Site Map」ページの親に当たるトップレベルページだからです。「Site Map」ページが他のトップレベルページの下層にある場合は、そのトップレベルページの色が白になり、「Home」ページの色は青になります。

 ASP.NET 1.1で親を判別するにはカスタムのアプローチが必要でしたが、ASP.NET 2.0では、SiteMapNode.IsDescendantOf()メソッドを使うことでこの処理を簡単に実現できます。

 次のコード例を見てください。

<asp:Repeater ID="rpt" runat="server" DataSourceID="dsBuckets">
  <ItemTemplate><%#
    IsBucketActive((SiteMapNode)Container.DataItem) ?
    // if the current page belongs to the current bucket
    "[display active image]" :
    // else if the current page does not belong
    // to the current bucket
    "[display regular image]"
  %>/ItemTemplate>
</asp:Repeater>

 RepeaterのItemTemplateが分離コード内でIsBucketActive()メソッドを呼び出し、現在のSiteMapNodeを渡します。IsBucketActive()関数は、CurrentNode.IsDescendentOf(nodeBucket)が真の場合にtrueを返します。

protected bool IsBucketActive(SiteMapNode nodeBucket) {
  // pages that don't contain an item in Web.sitemap return null
  if (SiteMap.CurrentNode == null)
    return false;
  else
    return SiteMap.CurrentNode.Equals(nodeBucket) ||
      SiteMap.CurrentNode.IsDescendantOf(nodeBucket);
}

 IsDescendantOf()関数とSiteMap.CurrentNodeプロパティの組み合わせは強力なツールとなります。既定のXmlSiteMapProviderはすべての情報をメモリに保持するので、パフォーマンスも高速です。次のソリューションでは、Repeaterのネストを必要とする垂直方向のナビゲーションを紹介します。

#3:トップレベルページに従属する第2レベルページ群を表示する

 垂直ナビゲーションでは、多くの場合、一番上にトップレベルページ群を表示し、アクティブなトップレベルページの下に第2レベルページ群を表示し、アクティブな第2レベルページの下に第3レベルページ群を表示します(図2を参照)。しかし、たしかRepeaterは階層データを表示できないはずでしたよね? 実は、Repeaterをネストしてデータバインド構文を使用すれば、階層データを表示することができます(詳しくは、「Nested DataGrids Simplify Hierarchical Data Display」を参照してください)。

図2 垂直方向のナビゲーション:本稿のサンプルページの左側にあるナビゲーションバーは垂直方向のナビゲーションである
図2 垂直方向のナビゲーション:本稿のサンプルページの左側にあるナビゲーションバーは垂直方向のナビゲーションである

 このソリューションのコードは次のようになります。

<asp:Repeater ID="Buckets" runat="server"
  DataSourceID="sourceBuckets">
  <ItemTemplate>
    <%# IsBucketActive((SiteMapNode)Container.DataItem) ?
      String.Format("<a href=\"{0}\"><b>{1}</b></a><br />,"
        ((SiteMapNode)Container.DataItem).Url,
        ((SiteMapNode)Container.DataItem).Title) :
      String.Format("<a href=\"{0}\">{1}</a><br />,"
        ((SiteMapNode)Container.DataItem).Url,
        ((SiteMapNode)Container.DataItem).Title)
    %>
    <asp:Repeater ID="Pails" runat="server" DataSource='<%# 
      ((SiteMapNode)Container.DataItem).ChildNodes %>' 
      Visible='<%# IsBucketActive( 
        (SiteMapNode)Container.DataItem) %>'>
      <ItemTemplate>
        <%# String.Format("  <a href=\"{0}\">{1}
        </a><br />,"
        ((SiteMapNode)Container.DataItem).Url,
        ((SiteMapNode)Container.DataItem).Title) %>
      </ItemTemplate>
    </asp:Repeater>
  </ItemTemplate>
</asp:Repeater>

 このアプローチでは、ネストの内側のRepeaterが外側のRepeaterの現在のSiteMapNodeを取得し、ChildNodes()関数を介してその子にバインドします。内側のRepeaterのVisibleプロパティとIsBucketActive()関数を組み合わせることで、アクティブなトップレベルページの第2レべルページ群だけを表示することができます。次のソリューションでは、第2レベルページ群を表示するためによく使われているもう1つの方法を紹介します。

ソリューション#4:トップレベルページの下の階層を表示する

 先ほどのソリューションでは、トップレベルページのHTMLコードの間に第2レベルページ群を表示する方法を紹介しました。サイトナビゲーションでは、すべてのトップレベルページを描画した後でアクティブなトップレベルページの子ページ群を表示するという処理もよく要求されますが、これには別のアプローチが必要です。その完ぺきな例が図1の第2レベルのナビゲーションです。

 このアプローチは単純です。アクティブなトップレベルページの子ページのみを公開する2つ目のSiteMapDataSourceを追加します。

<asp:SiteMapDataSource ID="srcPails" runat="server"
  ShowStartingNode="False" StartingNodeOffset="1" />

 StartingNodeOffsetを1に設定すると、開始ポイントはトップレベルページから1つ下のレベルに下がるので、現在アクティブなトップレベルページの子ページ群が公開されます。また、StartingNodeOffsetを2に設定すると、アクティブな第2レベルページの下の第3レベルページ群が公開されます。

次のページ
#5:「パンくずリスト」を表示する

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Lee Richardson(Lee Richardson)

Automated Architecture Inc.の創設者かつCEO。Blue InkアプリケーションおよびJAGソフトウェア開発方法論の作成者でもある。現在はHeadstrongコンサルティング社でシニアコンサルタントとして勤務し、高速アプリケーション開発(Rapid Application Development)テクノロジを専門とする。ソフトウェア開発経験は9年におよび、Microsoft認定ソリューションデベロッパー(MCSD)およびプロジェクトマネージメントプロフェッショナル(Project Management Professional:PMP)の資格を持つ。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/584 2006/09/27 00:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー