2009-03-10 7 views
0

私は、サイトマップを使用する構造のようなツリービューを見つけるためにだけ、MSのドキュメントの読み込みを通して良い外観を持っています。私は、誰もがどのようにサイトマップのナビゲーションのためのフォルダのような構造を持つことができるのを意識していないと思いますか?SiteMapの動作

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

を、例えば以下のような構造を取る「について」と「連絡先」のフォルダになりますが、サイトマップは、単一ページ上の階層になることはありません。したがって、ルートページには2つのメニュー項目があり、1つは「ホーム」で、aboutおよびドリルダウンメニューにドリルダウンするフォルダのように機能し、もう1つは免責事項のページへのリンクです。私は、 "About"と "Contact"のリンクをメニューに追加し、 "Home"と "Disclaimer"を隠すHomeをクリックすることができます。

Home > 
Disclaimer 

は、その後自宅をクリックして、すべてのメニューが戻ってきて、「アップ」メニューを持っているでしょう

Me 
My Family 
My Pets 

を取得したいあなたについてをクリックしたとき、あなたはその後

About > 
Contact > 

になるだろうフォルダーを外します。

私は簡単な解決策はありませんが、現時点では私たちの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> 

を思い付くしなければならなかった

EDIT

後のモデル)。

私はその後、一時的にだけでテストするために、再び身体

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

ここでは例のサイトマップがあります。

答えて

1

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

すべてのページは、ベースページクラスから継承させる(またはマスターページを使用し、いずれかの方法は、あなただけのコードの1つのコピーを持っています。)

の名前を付け、各ページ上のdivまたはスパンを作成します。適切な(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 procがあります...

+0

私の編集内容を確認したら、時間があれば素晴らしいと思います。 Cheers – Kezzer

+0

C#でGetURLを追加したばかりですが、それらのページでクエリーストリングを使用していない可能性があるので、おそらくあなたが働いていたはずのものです。もう一度見てみましょう。 –

+0

私はそれで問題を見つけることができないようですが、何も出力されませんが、おそらく私のサイトマップ(私は私の投稿の編集に入れました)とは関係ありません。私は明日、私が残念ながら仕事に戻ったときにチェックしなければならないでしょう。スニペットのために乾杯、それは完璧な意味があります。 – Kezzer

1

私は実際にはこれ以上何かを求めています。まったく同じことをすることは可能ですか?単純に<ul><li>要素で構成されるページを使用しますか?私が尋ねる理由は、私たちの "サイトマップ"が実際にセキュリティと機能性の面でより高度なものであるからです。実際に実行するメニューには、入力ボックスを備えた動的なドロップダウンリストがありますが、これはサイトマップに複製できないものです。

ので、アイデアは、代わりに

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

構造を除いてまったく同じことを行うことです。ルートノードはrunat = "server"を持つ必要があります。つまり、おそらくすべての子要素をトラバースすることができますか?この方法で私は<li></li>要素の中に何かを置くことができます。

私たちのセキュリティはあまりにも散発的です。サイトマップには、われわれが探している細かいコントロールがありません。

関連する問題