Imports System.Collections.Specialized
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Web.Caching
Imports System.Collections.Generic
Public Class LINQSiteMapProvider
Inherits StaticSiteMapProvider
Dim dcx As GrabdayDataContext
Dim RootMapNode As SiteMapNode
Dim UserID As Integer
Const _cacheDependencyName As String = "__SiteMapCacheDependency"
Public Overrides Sub Initialize(ByVal name As String, ByVal attributes As System.Collections.Specialized.NameValueCollection)
MyBase.Initialize(name, attributes)
dcx = New GrabdayDataContext
End Sub
Public Overrides Function BuildSiteMap() As System.Web.SiteMapNode
If RootMapNode IsNot Nothing Then Return RootMapNode
dcx = New GrabdayDataContext
RootMapNode = Nothing
Dim SitePages = From q In dcx.SitePages Where q.ParentID Is Nothing
Dim cmd As New SqlCommand("select sitepageid, parentid from SitePages", New SqlConnection(ConfigurationManager.ConnectionStrings("Grabday").ConnectionString))
Dim dependency = New SqlCacheDependency(cmd)
RootMapNode = SitePageNode(SitePages.FirstOrDefault)
AddNode(RootMapNode, Nothing)
AddChildNodes(RootMapNode, SitePages.FirstOrDefault)
HttpRuntime.Cache.Insert(_cacheDependencyName, New Object(), dependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, New CacheItemRemovedCallback(AddressOf OnSiteMapChanged))
Return RootMapNode
End Function
Protected Overrides Function GetRootNodeCore() As System.Web.SiteMapNode
BuildSiteMap()
Return RootMapNode
End Function
Sub AddChildNodes(ByVal ParentNode As SiteMapNode, ByVal ParentPage As SitePage)
Dim childs = From q In dcx.SitePages Where q.ParentID = ParentPage.SitePageID
Dim NewNode As SiteMapNode
For Each sp In childs
NewNode = SitePageNode(sp)
AddNode(NewNode, ParentNode)
AddChildNodes(NewNode, sp)
Next
If ParentPage.PageName = "OrdersByStatus" Then
Dim statusses = From q In dcx.OrderEvents Select q.Brief Distinct
Dim roles As String() = {}
Dim nvc As New NameValueCollection
nvc.Item("PageName") = "Orders"
For Each os As String In statusses
NewNode = New SiteMapNode(Me, os & "Orders", "~\Admin\Orders.aspx?Status=" & os, os & " Orders", os & " Orders", roles, nvc, New NameValueCollection, "")
AddNode(NewNode, ParentNode)
Next
End If
End Sub
Function SitePageNode(ByVal SitePage As SitePage) As SiteMapNode
Dim nvc As New NameValueCollection
nvc.Item("PageName") = SitePage.PageName
Dim roles As String() = {}
Return New SiteMapNode(Me, SitePage.SitePageID, If(SitePage.URL, "~\Admin\Menu.aspx" & "?ID=" & SitePage.SitePageID), SitePage.Title, SitePage.Description, roles, nvc, New NameValueCollection, "")
End Function
Sub OnSiteMapChanged()
Clear()
End Sub
End Class