2010-02-27 45 views
2

我正在使用VB.NET 3.5的CMS,我卡在一個概念。我有不同的模塊,可以完成不同的任務,比如wysiwyg,聯繫表單,圖像庫等等......但是,一個正在成爲一個挑戰的問題是圍繞着「如何」構建站點地圖。編譯概念需要建立一個頁面的網站地圖

爲了記錄,我不是在談論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 

我有我的代碼安裝在我填充所有相關領域到服務器端,我可以再訪問多次,沒有擊中對象這樣的方式DB一遍又一遍。

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,因爲這基本上是我現在正在做的,我真的不喜歡它。

回答

1

你可以使用一個DataList控件來設置列數並綁定與只有頂級物品。然後用一個簡單的函數來獲取childitems每個主要項目,使那些具有中繼器:

<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框架的其餘部分很好地集成。 :)

+0

感謝您的詳細解答。你能詳細說明一下asp.net站點地圖嗎?我不是在尋找「web.sitemap」,所以我不完全確定你在說什麼。 – 2010-02-28 05:37:46

+0

我只是說,從我所知道的情況來看,您正在實現的功能已經存在於ASP.NET站點地圖中。如果你需要更動態的東西(即從數據庫中讀取菜單結構),至少考慮以sitemap格式提取出來,以便將其插入到ASP.NET框架中。實施自定義Sitemap提供程序非常簡單。 :) http://msdn.microsoft.com/en-us/library/ms178431.aspx – 2010-02-28 06:34:26

+0

但是,該站點地圖無法從數據庫中提取數據。我的設置在數據庫方面很好,只是試圖確定頁面的網站地圖。感謝您的回答,我會在稍後的一天稍後嘗試。 – 2010-02-28 19:36:04

0

使用ASP:表控件,然後添加一個單元格在一個時間,當你達到你想要的寬度(5)啓動一個新行

+0

我意識到,但是因爲我必須記住父母和孩子,以及孩子的孩子,所以它更復雜。 – 2010-02-28 00:15:21

+0

孩子們會怎麼樣? – TFD 2010-02-28 00:43:41

+0

我上面編輯過,以顯示我在想的結構。我想我可以使用'
'或'

  • '而不是兒童的新表格行,但是認爲父母和子女之間肯定需要有一個視覺分隔。 – 2010-02-28 00:46:27