2009-03-10 8 views
0

J'ai bien regardé un chargement de documentation de MS seulement pour trouver une structure arborescente à l'utilisation de sitemaps. Je suppose que personne ne sait comment il est possible d'avoir une structure de type dossier pour la navigation dans le sitemap? Prenons par exemple une structure comme suitComportement de SiteMap

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

Le « A propos » et « Contact » serait dossiers, mais le plan du site est jamais hiérarchique sur une seule page. Ainsi, j'aurais ma page racine avec deux éléments de menu, l'un serait "Accueil" qui agit comme un dossier pour explorer les menus à propos et contact, et l'autre est un lien vers la page pour l'avertissement. Je veux être en mesure de cliquer sur Accueil qui va recharger le menu avec les liens pour "À propos" et "Contact" et masquer "Accueil" et "Disclaimer" tout à fait.

Home > 
Disclaimer 

Cliquez ensuite sur la maison et vous obtiendrez

About > 
Contact > 

Ensuite, en cliquant sur sur vous obtiendriez

Me 
My Family 
My Pets 

Chaque menus aurait un menu "up" pour revenir sur un dossier.

Je ne vois pas de solution facile, mais pour le moment nous utilisons des pages html statiques qui se trouvent dans différents dossiers partout dans notre application web. C'est quelque chose qui doit changer comme vous pouvez l'imaginer.

Des idées?

EDIT

J'ai dû trouver une solution 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> 

Ceci est dans le fichier de page maître directement (temporaire, je vais le placer dans le code derrière le modèle plus tard).

J'ai ensuite eu ce dans le corps

<div id="sidebar"> 
    <%= GetSecondaryNavItems() %> 
</div> 

Encore une fois, à titre temporaire juste pour tester. Il ne produit pas réellement quoi que ce soit mais je pense que ma définition GetURL est incorrecte. Je supposais que c'était juste en train d'obtenir le fichier? Je pourrais avoir tort cependant :)

EDIT EDIT: Pour une raison quelconque, je ne reçois aucune sortie, donc je pensais que c'était mon sitemap. Je vais avoir besoin de déboguer, mais je suis remoting en ce moment il est assez lent;)

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

est ici l'exemple plan du site.

Répondre

1

Vous pouvez toujours utiliser le fichier Sitemap.sitemap pour contrôler votre navigation, mais vous ne pourrez utiliser aucun des contrôles intégrés dans asp.net pour y parvenir. J'ai juste fait presque cette même chose sur un site que je viens de terminer.

Faites toutes vos pages héritent d'une classe de page de base (ou utiliser des pages maîtres, de toute façon, vous aurez seulement 1 copie de votre code.)

Créer une div ou étendue sur chaque page, ce nom approprié (divNav ou spnNav ou autre).

Dans votre page de base, au chargement de la page, parcourez tous les nœuds du plan de site pour trouver le nœud de la page en cours. Cela doit être un appel récursif.

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

Une fois que vous avez le nœud actuel, obtenez son parent.

Ajoutez un lien (le «menu supérieur pour revenir dans un dossier» comme vous l'avez appelé).

Puis faire un foreach (SiteMapNode à parent.ChildNodes)

Ajouter un lien pour chacun des enfants.

Ainsi, notre appel principal, que nous avons appelé à chaque chargement de page, était comme ça:

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

Je dois vous dire que le code ci-dessus fait partie copiée et une partie de moi deux mains lâchées. Mais cela devrait vous donner un bon départ, je pense.

EDIT: Désolé! Voici le processus 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; 
    } 
+0

Si vous vérifiez juste mon édition quand vous avez l'heure ce serait génial. Bravo – Kezzer

+0

Je viens d'ajouter le GetURL en C# pour vous, mais ce que vous auriez probablement dû faire, puisque je parie que vous n'utilisez pas de Querystrings sur ces pages. Je vais prendre un autre regard. –

+0

Je n'arrive pas à trouver le problème, mais rien ne sort du tout, bien que cela soit probablement lié à mon sitemap (je l'ai mis dans le montage de mon post). Je vais devoir vérifier demain quand je serai de nouveau au travail malheureusement. Bravo pour l'extrait, cela prend tout son sens. – Kezzer

1

Alors que je ne suis pas censé répondre, je demanderais quelque chose de plus à ce sujet. Est-il possible de faire exactement la même chose mais en utilisant une page qui est composée de simplement <ul> et <li> éléments? La raison pour laquelle je demande est parce que notre "sitemap" est en fait un peu plus avancé en termes de sécurité et de fonctionnalité. Les menus que nous exécutons disposent en fait de listes déroulantes dynamiques avec des zones de saisie, ce qui ne peut pas être dupliqué dans un sitemap.

Ainsi, l'idée est de faire exactement la même chose, sauf avec un

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

la structure à la place. Le nœud racine devrait avoir un runat = "server" dessus, de cette façon vous pourriez traverser tous les éléments enfants peut-être? De cette façon, je peux placer n'importe quoi dans mes éléments <li> et </li>.

Notre sécurité est assez sporadique aussi, quelque chose qu'un sitemap n'a pas le type de contrôle granulaire que nous recherchons.