【问题标题】:Coding concept needed to build a page sitemap构建页面站点地图所需的编码概念
【发布时间】:2010-02-27 22:12:48
【问题描述】:

我正在使用 VB.NET 3.5 开发 CMS,但我坚持一个概念。我有不同的模块来做不同的事情,比如所见即所得、联系表格、图片库等......但是一个正在成为一个挑战的模块是让我的头脑围绕“如何”构建站点地图。

为了记录,我不是在谈论 SEO 站点地图 (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 的记录(即:它们是顶级项目)列在顶部,所有的子项都列在下面。

<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,因为这基本上就是我现在正在做的事情,而且我真的一点也不喜欢它。

【问题讨论】:

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


    【解决方案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 框架的其余部分很好地集成在一起。 :)

    【讨论】:

    • 感谢您的详细解答。你能详细说明一下 asp.net 站点地图吗?我不是在寻找“web.sitemap”,所以我不完全确定你在说什么。
    • 我的意思是,据我所知,您正在实现的功能已经存在于 ASP.NET 站点地图中。如果您需要更动态的东西(即从数据库中读取菜单结构),至少考虑以站点地图格式将其拉出,以便将其插入 ASP.NET 框架。实现自定义站点地图提供程序非常简单。 :) msdn.microsoft.com/en-us/library/ms178431.aspx
    • 但站点地图无法从数据库中提取数据。我的设置在数据库方面很好,只是试图确定页面站点地图。感谢您在上面的回答,我会在当天晚些时候尝试一下。
    【解决方案2】:

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

    【讨论】:

    • 我意识到这一点,但它更复杂,因为我必须牢记父母和孩子,以及孩子的孩子。
    • 孩子等会发生什么?
    • 我在上面进行了编辑以显示我正在考虑的结构。我想我可以使用&lt;/br&gt;&lt;li&gt;Child&lt;/li&gt; 来代替儿童的新表格行,但我认为父母和儿童之间肯定需要在视觉上分离
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2021-02-09
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多