2010-02-27 6 views
2

Je travaille sur un CMS en utilisant VB.NET 3.5 et je suis bloqué sur un concept. J'ai différents modules qui font des choses différentes comme wysiwyg, formulaire de contact, galerie d'images, etc ... mais celui qui devient un peu un défi est de contourner "comment" construire un sitemap. Pour l'anecdote, je ne parle PAS d'un sitemap SEO (XML), mais plutôt d'un plan du site similaire à Karamasoft (regardez le style BMW ou Dell pour avoir une idée de ce que je tire).Concept de codage nécessaire pour construire un sitemap de page

Ma base de données contient les colonnes suivantes

ID  ParentID  MenuName  Slug   DateUpdated 

1   Null   Home   ~/home   01/01/2010 
2   Null   About   ~/about   01/01/2010 
3   Null   Contact   ~/contact  01/01/2010 
4   2    History   ~/history  01/01/2010 
5   2    Future   ~/future  01/01/2010 
6   3    Jobs   ~/jobs   01/01/2010 

J'ai ma configuration de code de telle sorte que je remplir tous les champs pertinents dans un objet sur le côté serveur que je peux alors accéder plusieurs fois sans frapper la DB encore et encore.

Public Shared ReadOnly Property Instance() As List(Of NavigationDataItem) 
     Get 
      Dim n As New List(Of NavigationDataItem)() 

      If _Instance Is Nothing Then 

       Dim PagesDC As New Dal.icms_PagesDataContext() 
       Dim results = PagesDC.icms_Pages_GetPageMenu().ToList 

       For Each o As Object In results 
        If o.isHomePage Then 
         n.Add(New NavigationDataItem(o.ID, o.ParentID, o.MenuName, "~/", o.DateUpdated)) 
        Else 
         n.Add(New NavigationDataItem(o.ID, o.ParentID, o.MenuName, o.Slug, o.DateUpdated)) 
        End If 
       Next 

       _Instance = n 
      Else : n = _Instance 
      End If 
      Return n 
     End Get 
    End Property 'Instance 

Ce que je suis en train de faire est d'avoir tous les documents qui n'ont pas ParentID (IE: ils sont des éléments de haut niveau) figurer en haut, et l'ensemble de ses enfants énumérés ci-dessous.

<table> 
    <tr> 
    <th>Home</th> 
    <th>About</th> 
    <th>Contact</th> 
    </tr> 
    <tr> 
    <td>&nbsp;</td> 
    <td>History</td> 
    <td>Jobs</td> 
    </tr> 
    <tr> 
    <td>&nbsp;</td> 
    <td>Future</td> 
    <td>&nbsp;</td> 
    </tr> 
</table> 

Je veux être en mesure de définir dynamiquement le nombre de colonnes de la table, de sorte que si j'ai 10 articles de parents et ne tournerai ma largeur à 5 colonnes, les éléments parents restants seraient répertoriés dans une autre ligne de tableau ci-dessous .

Je suis sûr que je peux créer le code moi-même une fois que je me suis mis à penser à cela, je cherche juste un "concept" sur la façon d'aborder ce problème.

Aussi, je ne cherche pas un Treeview puisque c'est fondamentalement ce que je fais maintenant et je ne l'aime vraiment pas du tout.

Répondre

1

Vous pouvez utiliser un DataList pour définir le nombre de colonnes et de se lier qu'avec articles de haut niveau seulement. Ensuite, utilisez une fonction simple pour obtenir les childitems pour chaque élément principal et rendre ceux avec un répéteur:

<asp:DataList RepeatColumns="5" DataSource="<%#GetParentMenuItems()%>" runat="server"> 
    <ItemTemplate> 
    <h1><%#Container.DataItem.MenuName%></h1> 
    <hr /> 
    <asp:Repeater DataSource="<%#GetChildMenuItems(Container.DataItem.ID)%>" runat="server"> 
     <ItemTemplate> 
     <a href="<%#Container.DataItem.Slug%>"><%#Container.DataItem.MenuName%></a> 
     <br /> 
     </ItemTemplate> 
    </asp:Repeater> 
    </ItemTemplate> 
</asp:DataList> 

Idéalement, les éléments enfants seraient une collection pendaient parent, vous pouvez alors lier le répéteur imbriquée à celle directement. Vous pouvez ensuite créer un contrôle utilisateur qui restitue les éléments, puis l'imbriquer pour afficher les sous-éléments. Sur une note de côté: Je pense que vous allez vous faire une faveur en restant sur le sitemap .NET plutôt que de créer le vôtre. Beaucoup de contrôles pratiques l'utilisent, et il est bien intégré avec le reste du framework ASP.NET. :)

+0

Merci pour la réponse détaillée. Pouvez-vous élaborer sur le sitemap asp.net? Je ne cherche pas le "web.sitemap", donc je ne suis pas entièrement sûr de ce dont vous parlez. –

+0

Je voulais juste dire que d'après ce que je peux dire, la fonctionnalité que vous implémentez est déjà là avec le sitemap ASP.NET. Si vous avez besoin de quelque chose de plus dynamique (c.-à-d.lire la structure de menu hors d'une base de données), au moins envisager d'extraire cela dans le format sitemap, de sorte qu'il peut être branché dans le cadre ASP.NET. Implémenter un fournisseur de sitemap personnalisé est assez facile. :) http://msdn.microsoft.com/en-us/library/ms178431.aspx –

+0

Mais le sitemap n'a pas la capacité d'extraire des données de la base de données. Ma configuration est bonne du point de vue de la base de données, essayant juste d'établir le sitemap de la page. Merci pour votre réponse ci-dessus, je vais l'essayer un peu plus tard dans la journée. –

0

Utilisez un ASP: contrôle de la table et ajouter les cellules une à la fois, lorsque vous atteignez votre largeur désirée (5) lancer une nouvelle ligne

+0

Je me rends compte que, cependant, c'est plus compliqué car je dois garder à l'esprit les parents et les enfants, ainsi que les enfants des enfants. –

+0

Que va-t-il se passer avec les enfants, etc.? – TFD

+0

J'ai édité ci-dessus pour montrer la structure que je pensais. Je suppose que je pourrais utiliser '
' ou '

  • Child
  • 'au lieu de nouvelles lignes de table pour les enfants, mais pense qu'il doit y avoir une séparation visuelle entre les parents et les enfants –