构建页面站点地图所需的编码概念

时间:2010-02-27 22:12:49

标签: asp.net vb.net content-management-system sitemap

我正在使用VB.NET 3.5在CMS上工作,我坚持一个概念。我有不同的模块,可以做各种各样的事情,比如所见即所得,联系表格,图片库等等......但是一个正在变得有点挑战的模块就是围绕“如何”建立一个站点地图。

为了记录,我不是在谈论SEO Sitemap(XML),而是一个类似于Karamasoft的访客站点地图(查看宝马或戴尔风格,了解我正在拍摄的内容) )。

我的数据库包含以下列

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

我要做的是让所有没有ParentID的记录(IE:它们是顶级项目)列在顶部,并且所有这些记录都列在下面。

<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 个答案:

答案 0 :(得分:1)

您可以使用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框架的其余部分集成。 :)

答案 1 :(得分:0)

使用ASP:表格控件并在达到所需宽度时一次添加一个单元格(5)开始新行