質問
サイトマップを使用するための構造のようなツリービューを見つけるためだけに、多くのMSドキュメントをよく見てきました。サイトマップナビゲーションにフォルダのような構造を持たせる方法を誰もが知っているとは思いませんか?たとえば、次のような構造を取ります
Home
About
Me.aspx
MyFamily.aspx
MyPets.aspx
Contact
Telephone.aspx
Email.aspx
Disclaimer.aspx
<!> quot; About <!> quot;および<!> quot; Contact <!> quot;フォルダーになりますが、サイトマップが単一ページ上で階層化されることはありません。そのため、ルートページには2つのメニュー項目があり、1つは<!> quot; Home <!> quot;です。これは、AboutメニューとContactメニューにドリルダウンするフォルダーのように機能し、もう1つは免責事項のページへのリンクです。 [ホーム]をクリックして、メニューに<!> quot; About <!> quot;のリンクを再読み込みします。および<!> quot; Contact <!> quot;非表示<!> quot;ホーム<!> quot;および<!> quot;免責事項<!> quot;完全に。
Home >
Disclaimer
ホームをクリックすると、取得できます
About >
Contact >
次に、取得する情報をクリックすると
Me
My Family
My Pets
すべてのメニューには<!> quot; up <!> quot;フォルダーから戻るメニュー。
簡単な解決策はありませんが、現時点では、Webアプリケーション全体で異なるフォルダーにある静的なHTMLページを使用しています。想像できるとおり、これは変更が必要なものです。
アイデアはありますか
編集
VB.NETソリューションを考え出す必要がありました
<script runat="server">
Private Function GetSecondaryNavItems() As String
Dim sRet As String = ""
Dim oCurrNode As System.Web.SiteMapNode = Nothing
Dim oCurrParentNode As System.Web.SiteMapNode = Nothing
'Dim sCurrPage As String = GetURL(Request.ServerVariables("SCRIPT_NAME").ToLower())
Dim sCurrPage As String = GetURL(HttpContext.Current.Request.ServerVariables("SCRIPT_NAME").ToLower())
oCurrNode = GetCurrentNode(sCurrPage, SiteMap.RootNode)
If Not oCurrNode Is Nothing Then
oCurrParentNode = oCurrNode.ParentNode
End If
If Not oCurrParentNode Is Nothing Then
If Not oCurrParentNode Is SiteMap.RootNode Then
sRet += "Parent Folder Link"
If Not oCurrNode Is Nothing Then
For Each oChild As SiteMapNode In oCurrParentNode.ChildNodes
sRet += "Link for child"
Next
End If
End If
End If
Return sRet
End Function
Private Function GetURL(ByVal fullURL As String) As String
Return fullURL.Substring(fullURL.LastIndexOf("/"))
End Function
Private Function GetCurrentNode(ByVal _sCurrentPageURL As String, ByVal _oNode As SiteMapNode) As SiteMapNode
Dim oNodeRet As SiteMapNode = Nothing
For Each oNodeCheck As SiteMapNode In _oNode.ChildNodes
If oNodeCheck.HasChildNodes = True Then
oNodeRet = GetCurrentNode(_sCurrentPageURL, oNodeCheck)
End If
If oNodeRet Is Nothing Then
Exit For
End If
Dim sURL As String = oNodeCheck.Url.ToLower()
Dim iPos As Integer = sURL.IndexOf("?")
If iPos > 0 Then
sURL = sURL.Substring(0, iPos)
End If
iPos = sURL.LastIndexOf("/")
If iPos > 0 Then
sURL = sURL.Substring(iPos)
End If
If sURL = _sCurrentPageURL Then
oNodeRet = oNodeCheck
Exit For
End If
Next
Return oNodeRet
End Function
</script>
これは、マスターページファイルに直接あります(一時的なもので、後でコードビハインドモデルに配置します)。
その後、これを本文に入れました
<div id="sidebar">
<%= GetSecondaryNavItems() %>
</div>
また、一時的にテストするためだけに。実際には何も出力されませんが、GetURLの定義が間違っていると思います。私はそれが実際のファイルを取得していると仮定していましたか?私は非常に間違っている可能性があります:)
編集編集:何らかの理由で出力が得られないので、それが私のサイトマップだと思った。デバッグする必要がありますが、現時点ではリモーティングしているので非常に遅いです;)
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="Accounts/Default.aspx" title="Accounts" description="Accounts">
<siteMapNode url="Accounts/Test.aspx" title="Client Balances" description="Client Balances">
<siteMapNode url="Hello.aspx" title="Hello" description="rarar" />
<siteMapNode url="Hiya.aspx" title="Hiya" description="rarar" />
</siteMapNode>
<siteMapNode url="Test.aspx" title="Test" description="rarar" />
</siteMapNode>
</siteMap>
サイトマップの例です。
解決
Sitemap.sitemapファイルを使用してナビゲーションを制御することはできますが、これを実現するためにasp.netの組み込みコントロールを使用することはありません。完成したばかりのサイトで、まさにこれをやったのです。
すべてのページをベースページクラスから継承します(または、マスターページを使用します。どちらの方法でも、コードのコピーは1つだけです)。
各ページに適切な名前(divNavまたはspnNavなど)を付けてdivまたはspanを作成します。
ベースページで、ページの読み込み時に、すべてのサイトマップノードをループして、現在のページのノードを見つけます。これは再帰呼び出しである必要があります。
// Pass the current page url, all the way through the .aspx. In other words, do NOT pass any kind of
// query string.
private SiteMapNode GetCurrentNode(string _sCurrentPageURL, SiteMapNode _oNode)
{
SiteMapNode oNodeRet = null;
foreach (SiteMapNode oNodeCheck in _oNode.ChildNodes)
{
if (oNodeCheck.HasChildNodes == true)
{
oNodeRet = GetCurrentNode(_sCurrentPageURL, oNodeCheck);
}
if (oNodeRet != null)
break;
string sUrl = oNodeCheck.Url.ToLower();
int iPos = sUrl.IndexOf("?");
if (iPos > 0)
sUrl = sUrl.Substring(0, iPos);
iPos = sUrl.LastIndexOf("/");
if (iPos > 0)
sUrl = sUrl.Substring(iPos);
if (sUrl == _sCurrentPageURL)
{
oNodeRet = oNodeCheck;
break;
}
}
return oNodeRet;
}
現在のノードを取得したら、その親を取得します。
リンクを追加します(<!> quot;フォルダーに戻るためのアップメニュー<!> quot;呼び出したとおり)。
次にforeach(parent.ChildNodesのSiteMapNode)を実行します
各子のリンクを追加します。
つまり、ページを読み込むたびに呼び出すメイン呼び出しは次のようになりました。
public string GetSecondaryNavItems()
{
string sRet = "";
// Get the node that matches most of this url...
System.Web.SiteMapNode oCurrNode = null;
System.Web.SiteMapNode oCurrParentNode = null;
string sCurrPage = GetURL(Request.ServerVariables["SCRIPT_NAME"].ToLower());
oCurrNode = GetCurrentNode(sCurrPage, SiteMap.RootNode);
if(oCurrNode != null)
oCurrParentNode = oCurrNode.ParentNode;
if(oCurrParentNode != null)
if(oCurrParentNode != SiteMap.RootNode)
sRet += "Parent Folder link";
if(oCurrNode != null)
{
foreach (System.Web.SiteMapNode oChild in oCurrParentNode.ChildNodes)
{
sRet += "Link for child";
}
}
}
上記のコードは、一部がコピーされ、一部は私が自由に書き直したものであるということを伝えなければなりません。しかし、これは良いスタートを切るはずです、と思います。
編集:申し訳ありません! GetURLプロシージャは次のとおりです...
public string GetURL(string _sURL)
{
string sRet = _sURL;
int iPos = sRet.IndexOf("?");
if (iPos > 0)
sRet = sRet.Substring(0, iPos);
iPos = sRet.LastIndexOf("/");
if (iPos > 0)
sRet = sRet.Substring(iPos);
return sRet;
}
他のヒント
返事をするつもりはないが、実際にこれについてさらに質問したい。まったく同じことを行うことはできますが、単に<ul>
要素と<li>
要素で構成されるページを使用しますか?私が尋ねる理由は、<!> quot; sitemap <!> quot;実際には、セキュリティと機能の両方の面で少し高度です。実際に実行するメニューには、入力ボックス付きの動的なドロップダウンリストがあります。これは、サイトマップで複製できないものです。
したがって、アイデアは、aを除いてまったく同じことを行うことです
<ul>
<li>
<ul>
<li></li>
</ul>
</li>
<li></li>
<li></li>
</ul>
代わりに構造。ルートノードにはrunat = <!> quot; server <!> quot;が必要です。その上で、おそらくすべての子要素をトラバースできますか?このようにして、</li>
および<=>要素内に何でも配置できます。
私たちのセキュリティも散発的であり、サイトマップには私たちが探しているようなきめ細かな制御がありません。