![]() 図 1: Web サイトの構造 |
![]() 図 2: 新しいサイトマップの追加 |
<?xml バージョン="1.0" エンコーディング="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx" title="ホーム" description="私の Web サイト"> <siteMapNode url="~/products/default.aspx" title="製品"> <siteMapNode url="~/products/product1.aspx" title="最初の製品" /> <siteMapNode url="~/products/product2.aspx" title="2 番目の製品" /> </siteMapNode> <siteMapNode url="~/services/default.aspx" title="サービス"> <siteMapNode url="~/services/service1.aspx" title="最初のサービス" /> <siteMapNode url="~/services/service2.aspx" title="2 番目のサービス" /> </siteMapNode> <siteMapNode url="contact.aspx" title="お問い合わせ" /> </siteMapNode> </サイトマップ> |
プロパティの | 説明 |
タイトルには、 | ページのタイトルが表示されます。このプロパティは、URL のタイトルを表示するためにナビゲーション コントロールでよく使用されます。 |
url には、 | このノードによって記述されるページの URL が表示されます。 |
description には、 | このページに関する説明を指定します。この説明を使用して、プロンプトの内容を表示できます。 |
ロール | セキュリティ トリミング (後述) を使用して、この属性はこのページへのアクセスを許可されるロールを指定します。 |
![]() 図 3: パンくずリストのナビゲーション |
Web フォーム名 | フォルダー |
Default.aspx | Web サイトのルート |
Contact.aspx | Web サイトのルート |
Default.aspx | Products |
Product1.aspx | Products |
Product2.aspx | Products |
Default.aspx | Services |
Service1.aspx | Services |
Service2.aspx | Services |
<%@ マスター言語="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="サーバー"> <title>無題ページ</title> </頭> <本文> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Font-Size="XX-Large" ForeColor="Blue" Text="ようこそ!"></asp:Label><br /> <asp:SiteMapPath ID="SiteMapPath1" runat="サーバー" Font-Names="Verdana" Font-Size="0.8em" PathSeparator=" : "> <PathSeparatorStyle Font-Bold="True" ForeColor="#5D7B9D" /> <CurrentNodeStyle ForeColor="#333333" /> <NodeStyle Font-Bold="True" ForeColor="#7C6F57" /> <RootNodeStyle Font-Bold="True" ForeColor="#5D7B9D" /> </asp:サイトマップパス> <br /> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> </フォーム> </本文> </html> |
![]() 図 4: Default.aspx のサンプル実行 |
HyperLink ID | Text プロパティ | NavigateUrl プロパティ |
HyperLink1 | Products | ~/products/default.aspx |
HyperLink2 | Services | ~/Services/default.aspx |
HyperLink3 | Contact Us | ~/contact.aspx表 |
<%@ ページ言語="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="無題ページ" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="サーバー"> <中央> <テーブル> <tr> <td幅="60%"> <asp:Label ID="Label1" runat="server" Font-Size="X-Large" Text="当社の Web サイトへようこそ!"></asp:Label></td> </tr> <tr> <td幅="60%"> <asp:HyperLink ID="HyperLink1" runat="サーバー" Font-Size="X-Large" NavigateUrl="~/Products/Default.aspx">製品 </asp:HyperLink></td> </tr> <tr> <td幅="60%"> <asp:HyperLink ID="HyperLink2" runat="server" Font-Size="X-Large" NavigateUrl="~/Services/Default.aspx">サービス </asp:HyperLink></td> </tr> <tr> <td幅="60%"> <asp:HyperLink ID="HyperLink3" runat="サーバー" Font-Size="X-Large" NavigateUrl="~/Contact.aspx">お問い合わせ </asp:HyperLink></td> </tr> </テーブル> </中央> </asp:コンテンツ> |
![]() 図 5: Products フォルダーのデフォルト ページ |
HyperLink ID | Text プロパティ | NavigateUrl プロパティ |
HyperLink1 | First Product | ~/products/product1.aspx |
HyperLink2 | Second Product | ~/products/product2.aspx |
![]() 図 6. Services フォルダーのデフォルト ページ |
HyperLink ID | Text プロパティ | NavigateUrl プロパティ |
HyperLink1 | First Service | ~/Services/service1.aspx |
HyperLink2 | Second Service | ~/Services/service2.aspx |
Web フォーム名 | のテキスト属性 | ラベル
~/Contact.aspx | お問い合わせ |
~/Products/Product1.aspx | 最初の製品の詳細 |
~/Products/Product2.aspx | 2 番目の製品の詳細 |
~/Services/Service1.aspx | 最初のサービスの詳細 |
~/Services/Service2。 aspx | 2 番目のサービス詳細 |
![]() 図 7: Product1.aspx のサンプル実行 |
web.sitemap ファイルの title 属性と URL 属性が「ブレッドクラム」の生成にどのように使用されるかに注目してください。また、現在のページ タイトルとともに親がどのように表示されるかにも注目してください。さまざまなページに移動して、SiteMapPath コントロールを観察してみてください。
4. SiteMap データ ソース コントロールを使用する
サイト マップの使用は、SiteMapPath コントロールに限定されません。サイトマップをナビゲート可能なコントロール (TreeView など) に添付することもできます。次の例では、同じサイト マップ ファイルを使用して TreeView コントロールへのバインドを実装します。
新しい Web フォーム SiteMapDataSourceDemo.aspx を Web サイトに追加します。次に、SiteMap データ ソース コントロール (SiteMapDataSource1) と TreeView コントロール (TreeView1) をフォームにドラッグします。この TreeView コントロールの DataSourceID プロパティを SiteMapDataSource1 に設定します。さらに、TreeView コントロールの ShowLines プロパティを true に設定します。 SiteMapDataSourceDemo.aspx ページの完全なマークアップは次のとおりです。
<%@ ページ言語="C#" AutoEventWireup="true" CodeFile="SiteMapDataSourceDemo.aspx.cs" 継承="SiteMapDataSourceDemo" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="サーバー"> <title>無題ページ</title> </頭> <本文> <form id="form1" runat="server"> <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" ShowLines="True"> </asp:ツリービュー> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" /> </フォーム> </本文> </html> |
次に、Web フォームを実行して、同じナビゲーション構造が TreeView にどのように自動的に生成されるかを確認します (図 8 を参照)。
![]() 図 8: サイトマップ ファイルを TreeView コントロールにバインドする |
プロパティの | 説明 |
ChildNodes は、 | 現在のノードのすべての子ノードのコレクションを表します |
HasChildNodes は、 | サイト マップ ノードに子ノードがあるかどうか (true/false) を示します |
Title は | 、サイト マップ ファイルで指定された title 属性の値を返します |
Url は、 | サイト マップ ファイルで返します指定された url 属性の値 |
description は、 | サイト マップ ファイルで指定された description 属性の値を返します。 |
ParentNode は、 | 現在のノードの親サイト マップ ノードの参照を示します。 |
protected void Page_Load(オブジェクト送信者, EventArgs e) { int count = SiteMap.RootNode.ChildNodes.Count; for (int i = 0; i < count; i++) { SiteMapNode smNode=SiteMap.RootNode.ChildNodes[i]; TreeNode tvNode = new TreeNode(smNode.Title, "", "", smNode.Url, ""); TreeView1.Nodes.Add(tvNode); if (smNode.HasChildNodes) { int childCount=smNode.ChildNodes.Count; for (int j = 0; j < childCount; j++) { SiteMapNode smChildNode = smNode.ChildNodes[j]; TreeNode tvChildNode = new TreeNode(smChildNode.Title, 「」、「」、 smChildNode.Url, ""); tvNode.ChildNodes.Add(tvChildNode); } } } } |
ここでは、まずルート ノード内の子ノードの合計数を取得します。次に、ルート ノードの ChildNodes コレクションをループします。反復ごとに、TreeNode クラスの新しいインスタンスを作成し、そのコンストラクターでそのタイトルと URL を指定します。次に、この TreeNode を TreeView の Nodes コレクションに追加します。次に、現在の SiteMapNode に子ノードがあるかどうかを確認します。存在する場合は、それを走査し、TreeNode の作成プロセスを繰り返します。今回は、新しい TreeNode を現在の TreeNode オブジェクトの ChildNodes コレクションに追加することに注意してください。
ネストのレベルが 2 つしかないことがわかっているため、ループ内で 2 を使用していることに注意してください。ロジックをより一般的にするには、再帰を使用して TreeView に値を設定します。
Web フォームを実行すると、図 8 のようなものが再び表示されます。
6. 使用上の安全保守
多くの場合、Web サイトではロールベースのセキュリティ モデルが実装されています。たとえば、アプリケーション内でシステム管理者、製品テスター、サービス テスターなどのさまざまな役割を持つことができます。このような状況では、多くの場合、ユーザーに表示されるサイト ナビゲーション リンクを制御する必要があります。たとえば、現在ログインしているユーザーが製品テスターの役割を持っている場合、製品に関連するリンクのみを表示し、他のリンクを非表示にすることができます。ロールを処理する 1 つの方法は手動コーディングを使用することですが、その場合はすべての承認ロジックをプログラムで実装する必要があります。幸いなことに、サイトマップ ファイルと SiteMap データ ソース コントロールは、セキュリティ トリミングと呼ばれる役立つ機能を提供します。
セキュリティの見直しをテストするには、サイトのメンバーシップとロールの機能を有効にする必要があります。 web.config ファイルを開き、次のタグを追加します。
<認証モード="フォーム" /> <認可> <ユーザーを拒否=”?"></拒否> </認可> |
<roleManager Enabled="true" /> |
![]() 図 9: Web サイト管理ツールを使用した役割の追加 |
![]() 図 10: Web サイト管理ツールを使用したユーザーの作成 |
<?xml バージョン="1.0" エンコーディング="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx" title="ホーム" description="私の Web サイト"> <siteMapNode title="製品" role="ProductTesters"> <siteMapNode url="~/products/product1.aspx" title="最初の製品" /> <siteMapNode url="~/products/product2.aspx" title="2 番目の製品" /> </siteMapNode> <siteMapNode title="サービス"roles="ServiceTesters"> <siteMapNode url="~/services/service1.aspx" title="最初のサービス" /> <siteMapNode url="~/services/service2.aspx" title="2 番目のサービス" /> </siteMapNode> <siteMapNode url="contact.aspx" title="お問い合わせ" /> </siteMapNode> </サイトマップ> |
<siteMap defaultProvider="myprovider" Enabled="true"> <プロバイダー> <add name="マイプロバイダ" type="System.Web.XmlSiteMapProvider " siteMapFile="SecurityTrimming.sitemap" securityTrimmingEnabled="true" /> </プロバイダー> |
![]() 図 11: ログイン ページ |
![]() 図 12: 使用安全改修 |