簡體   English   中英

使用ASP.Net Web表單和C#的站點導航/面包屑

[英]Site Navigation / Breadcrumb using ASP.Net Web form and C#

我正在一個網站上工作,該網頁的頁面排列在一個包含父子關系的表格中。 頁面深度可以到任何級別,我想基於數據庫為網站生成BreadCrumb。 示例數據和數據字段如下圖所示。

基本表結構類似於TableName Web_Pages

表列(PageID int,PageName Varchar,PageInternalLinkURL Varchar,PageInheritance int)

表中的示例數據示例 表數據的示例

頁面上BreadCrumb的示例 頁面上BreadCrumb的示例

我希望站點導航的面包屑看起來類似於下面的示例圖像中顯示的內容。

我試了幾個星期但是沒能把它弄好。

我想在站點地圖中使用它,而不是我想用語法創建它並將PageName字段與正確的頁面URL鏈接。

我想這樣做,以便當一個頁面被添加到CMS時面包屑是動態創建的,可以使用任何頁面深度。

我使用CTE查詢,但無法正常工作。 如果有人解決這個問題,或者可以指出一個類似於我的完整工作示例,我將不勝感激。

測試CTE不起作用

SELECT * FROM pg_Pages;
WITH RecursiveTable (PageId, PageInheritance, Level)
AS
(
   --Anchor
    SELECT      tt.PageId,  tt.PageInheritance,  0 AS Level
    FROM pg_Pages AS tt
    WHERE PageInheritance = 0
    UNION ALL
    --Recursive member definition
    SELECT  tt.PageId, tt.PageInheritance, LEVEL + 1
    FROM pg_Pages AS PageId
        INNER JOIN RecursiveTable rt ON
        tt.PageInheritance = rt.PageId
)
SELECT * 
FROM RecursiveTable

看起來你的CTE是錯誤的 - 你幾乎就在那里,但Recursive Member Definition位看起來不對。

嘗試:

SELECT * FROM pg_Pages;
WITH RecursiveTable (PageId, PageInheritance, Level)
AS
(
   --Anchor
    SELECT      tt.PageId,  tt.PageInheritance,  0 AS Level
    FROM pg_Pages AS tt
    WHERE PageInheritance = 0
    UNION ALL
    --Recursive member definition
    SELECT  tt.PageId, tt.PageInheritance, Level + 1
    FROM pg_Pages AS tt
        INNER JOIN RecursiveTable rt ON
        tt.PageInheritance = rt.PageId
)
SELECT * 
FROM RecursiveTable
--SELECT * FROM RecursiveTable WHERE Level = 0

在您的原始嘗試中,pg_Pages的別名需要為tt(並且您還需要使用tt作為PageInheritance的前綴)。

否則,它看起來很好。

編輯

對於其他問題,您只需添加其他列:

SELECT * FROM pg_Pages;
WITH RecursiveTable (PageId, PageName, PageInternalLink, PageInternalLinkUrl, PageInheritance, Level)
AS
(
   --Anchor
    SELECT      tt.PageId,  tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance,  0 AS Level
    FROM pg_Pages AS tt
    WHERE PageInheritance = 0
    UNION ALL
    --Recursive member definition
    SELECT  tt.PageId,  tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance, Level + 1
    FROM pg_Pages AS tt
        INNER JOIN RecursiveTable rt ON
        tt.PageInheritance = rt.PageId
)
SELECT * 
FROM RecursiveTable
--SELECT * FROM RecursiveTable WHERE Level = 0

進一步編輯:

好的,要做你想做的事,你可以轉動查詢; 如果您知道頁面ID:

DECLARE @PageId int
SET @PageId = 39;
WITH RecursiveTable (PageId, PageName, PageInternalLink, PageInternalLinkUrl, PageInheritance, Level)
AS(
   --Anchor
    SELECT      tt.PageId,  tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance,  0 AS Level
    FROM TestPage AS tt
    WHERE PageId = @PageId
    UNION ALL
   --Recursion
    SELECT tt.PageId,  tt.PageName, tt.PageInternalLink, tt.PageInternalLinkUrl, tt.PageInheritance, Level + 1
    FROM TestPage AS tt
    INNER JOIN RecursiveTable rt ON rt.PageInheritance = tt.PageId
)
SELECT * FROM RecursiveTable ORDER BY Level DESC

我們在這里做的是從您所在的頁面開始,然后在桌子上向后尋找所有父母。 在這種情況下,具有最高級別的記錄是最終父級,因此我們按級別按降序排序以反映這一點。

假設您要檢索pageId 39的痕跡,您可能想嘗試這樣的事情:

declare @pageId int

set @pageId=39;
WITH RecursiveTable (PageId,PageName, PageInheritance,PageInternalLinkURL, Level)
AS
(
   --Anchor
    SELECT      tt.PageId,tt.PageName,  tt.PageInheritance,tt.PageInternalLinkURL,  0 AS Level
    FROM pg_pages AS tt
    WHERE PageID = @pageId
    UNION ALL
    --Recursive member definition
    SELECT  tt.PageId,tt.PageName,  tt.PageInheritance,tt.PageInternalLinkURL, Level + 1
    FROM pg_pages AS tt
        INNER JOIN RecursiveTable rt ON
        rt.PageInheritance = tt.PageId
)
SELECT * 
FROM RecursiveTable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM