Концепция кодирования, необходимая для построения карты сайта - PullRequest
2 голосов
/ 28 февраля 2010

Я работаю над CMS с использованием VB.NET 3.5 и застрял в концепции. У меня есть разные модули, которые делают разные вещи, такие как wysiwyg, контактную форму, галерею изображений и т. Д., Но одним из которых становится немного сложнее, когда я думаю о том, как создать карту сайта.

Для справки, я говорю не о SEO Sitemap (XML), а о карте сайта посетителя, похожей на Karamasoft (Проверьте BMW или стиль Dell, чтобы узнать, что я стрельба для).

В моей базе данных есть следующие столбцы

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

У меня настроен код таким образом, что я заполняю все соответствующие поля в объекте на стороне сервера, чтобы затем получить доступ несколько раз, не обращаясь к БД снова и снова.

    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

Я пытаюсь сделать так, чтобы все записи без NO ParentID (т. Е. Это элементы верхнего уровня) были перечислены вверху, а все их дочерние элементы - внизу.

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

Я хочу иметь возможность динамически устанавливать количество столбцов таблицы, чтобы, если у меня было 10 родительских элементов и я установил ширину только в 5 столбцов, оставшиеся родительские элементы были бы перечислены в другой строке таблицы ниже.

Я уверен, что смогу создать код сам, как только обдумаю это, я просто ищу «концепцию» о том, как подойти к этой проблеме.

Кроме того, я НЕ ищу Treeview, так как это в основном то, что я делаю сейчас, и я действительно не люблю его вообще.

Ответы [ 2 ]

1 голос
/ 28 февраля 2010

Вы можете использовать DataList, чтобы установить количество столбцов и связать его только с элементами верхнего уровня. Затем используйте простую функцию, чтобы получить дочерние элементы для каждого основного элемента и отобразить их с помощью повторителя:

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

В идеале, дочерние элементы должны быть коллекцией, висящей на родительском элементе, тогда вы можете напрямую привязать к ней вложенный повторитель. Затем вы можете создать пользовательский элемент управления, который отображает элементы, а затем вложить себя для отображения любых вложенных элементов.

С другой стороны: я думаю, что вы сделаете себе одолжение, если будете придерживаться карты сайта .NET, а не готовить свою собственную. Множество удобных элементов управления используют его, и он прекрасно интегрируется с остальной частью ASP.NET Framework. :)

0 голосов
/ 28 февраля 2010

Используйте элемент управления ASP: Table и добавляйте ячейки по одной, когда вы достигнете желаемой ширины (5), начинайте новую строку

...