我正在使用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> </td>
<td>History</td>
<td>Jobs</td>
</tr>
<tr>
<td> </td>
<td>Future</td>
<td> </td>
</tr>
</table>
我希望能够动态设置表列的数量,这样如果我有10个父项并且只将我的宽度设置为5列,则剩余的父项将列在下面的另一个表行中。
我确信自己可以自己构建代码一旦我解决这个问题,我只是在寻找一个关于如何解决这个问题的“概念”。
另外,我不是在寻找Treeview,因为那基本上就是我现在正在做的事情,我真的不喜欢它。
答案 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)开始新行