質問

サイトマップを使用するための構造のようなツリービューを見つけるためだけに、多くの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>および<=>要素内に何でも配置できます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top