0

サイトマップを使用するためのツリー ビューのような構造を見つけるためだけに、大量の MS ドキュメントをよく調べました。サイトマップのナビゲーションにフォルダーのような構造を持たせる方法を誰も知らないと思いますか? たとえば、次のような構造を取ります

Home
   About
      Me.aspx
      MyFamily.aspx
      MyPets.aspx
   Contact
      Telephone.aspx
      Email.aspx
 Disclaimer.aspx

「概要」と「連絡先」はフォルダーになりますが、サイトマップは単一のページで階層化されることはありません。したがって、ルート ページには 2 つのメニュー項目があり、1 つは "Home" で、[About] メニューと [Contact] メニューにドリルダウンするためのフォルダーのように機能し、もう 1 つは免責事項のページへのリンクです。ホームをクリックすると、「概要」と「連絡先」のリンクを含むメニューがリロードされ、「ホーム」と「免責事項」が完全に非表示になります。

Home >
Disclaimer

次に、ホームをクリックすると、

About >
Contact >

次に、あなたについてをクリックすると、

Me
My Family
My Pets

すべてのメニューには、フォルダーに戻るための「上」メニューがあります。

簡単な解決策があるとは思えませんが、現時点では、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 の定義が間違っていると思います。実際のファイルを取得しているだけだと思っていましたか?私は非常に間違っている可能性があります:)

EDIT EDIT : 何らかの理由で出力が得られないため、サイトマップだと思いました。私はそれをデバッグする必要がありますが、私は今のところリモートで作業しているので、かなり遅いです;)

<?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>

サイトマップの例を次に示します。

4

2 に答える 2

1

Sitemap.sitemapファイルを使用してナビゲーションを制御することはできますが、これを実現するためにasp.netに組み込まれているコントロールを使用することはありません。完成したばかりのサイトで、ほぼこれを実行しました。

すべてのページをベースページクラスから継承します(またはマスターページを使用します。どちらの場合も、コードのコピーは1つだけです)。

各ページにdivまたはspanを作成し、適切な名前(divNavまたはspnNavなど)を付けます。

ベースページで、ページの読み込み時に、すべてのサイトマップノードをループして、現在のページのノードを見つけます。これは再帰呼び出しである必要があります。

    // 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;
    }

現在のノードを取得したら、その親を取得します。

リンクを追加します(「フォルダから戻るためのアップメニュー」と呼びます)。

次に、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;
    }
于 2009-03-10T16:36:04.753 に答える
1

私は応答することになっていませんが、実際にはこれについてさらに質問します。<ul>単純に<li>要素で構成されたページを使用して、まったく同じことを行うことは可能ですか? 私が尋ねる理由は、私たちの「サイトマップ」が実際にはセキュリティと機能の両方の点で少し高度だからです. 私たちが実際に実行するメニューには、入力ボックスを備えた動的なドロップダウン リストがあります。これは、サイトマップで複製できないものです。

したがって、アイデアは、を除いてまったく同じことを行うことです

<ul>
   <li>
      <ul>
         <li></li>
      </ul>
   </li>
   <li></li>
   <li></li>
</ul>

代わりに構造。ルート ノードには runat="server" が必要です。そのようにして、おそらくすべての子要素をトラバースできますか? <li>このようにして、 and</li>要素内に何でも配置できます。

私たちのセキュリティも非常に散発的であり、サイトマップには、私たちが探しているような細かい制御がありません.

于 2009-03-16T09:42:21.640 に答える