在母版ASP.Net TreeView控件并不总是填充
-
22-07-2019 - |
题
我的工作我的第一次ASP.Net项目,我似乎已经在深水的一端被扔的时候了。我所有的网站文件存储在数据库中,所以我使用的VirtualPathProvider访问它们。这部分工作得很好,但后来我需要一个网站地图,将动态地拿起所有的文件,因为用户将添加/删除文件,因为他们去。要做到这一点,我创建了继承StaticSiteMapProvider一类,在我的母版页创建SiteMapDataSource时,和一个TreeView使用它。在大多数情况下,这个工程。当加载页面看到TreeView和它包含了所有它应该节点。然而,飘飞的TreeView的是完全空白 - 根本没有节点。我甚至复制的TreeView控件到内容页面。内容页面的TreeView总是工作,甚至当母版没有。 (另外,我不知道一个内容页面可以使用数据源的母版页上,直到我忘了复制数据源的控制!)
要调试的是,我把抛出异常在SiteMapProvider我BuildSiteMap()函数只是为了证明自己的代码进行实际运行。我发现,该异常被击中每一次。然而,堆栈跟踪是不一样的每一次。
在大多数情况下,这是我得到了什么:
[Exception: Test] ADEM.clsSiteMap.BuildSiteMap() in c:\inetpub\wwwroot\App_Code\clsSiteMap.vb:49 System.Web.StaticSiteMapProvider.GetChildNodes(SiteMapNode node) +54 System.Web.SiteMapNode.get_ChildNodes() +27 System.Web.UI.WebControls.SiteMapDataSource.GetNodes(SiteMapNode node) +52 System.Web.UI.WebControls.SiteMapDataSource.GetNodes() +329 System.Web.UI.WebControls.SiteMapDataSource.GetTreeView(String viewPath) +35 System.Web.UI.WebControls.SiteMapDataSource.GetHierarchialView(String viewPath) +32 System.Web.UI.HierarchialDataSourceControl.System.Web.UI.IHierarchialDataSource.GetHierarchialView(String viewPath) +10 System.Web.UI.WebControls.HierarchialDataBoundControl.GetData(String viewPath) +25 System.Web.UI.WebControls.TreeView.DataBindNode(TreeNode node) +73 System.Web.UI.WebControls.TreeView.PerformDataBinding() +120 System.Web.UI.WebControls.HierarchicalDataBoundControl.PerformSelect() +85 System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73 System.Web.UI.WebControls.TreeView.DataBind() +4 System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82 System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs e) +22 System.Web.UI.WebControls.TreeView.OnPreRender(EventArgs e) +36 System.Web.UI.Control.PreRenderRecursiveInternal() +80 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842
不过,大概经常TreeView中会拿出空白,我得到这个:
[Exception: Test] ADEM.clsSiteMap.BuildSiteMap() in c:\inetpub\wwwroot\App_Code\clsSiteMap.vb:49 System.Web.StaticSiteMapProvider.FindSiteMapNode(String rawUrl) +133 System.Web.SiteMapProvider.FindSiteMapNode(HttpContext context) +54 System.Web.SiteMapProvider.get_CurrentNode() +35 System.Web.UI.WebControls.TreeView.DataBindNode(TreeNode node) +219 System.Web.UI.WebControls.TreeView.PerformDataBinding() +120 System.Web.UI.WebControls.HierarchicalDataBoundControl.PerformSelect() +85 System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +73 System.Web.UI.WebControls.TreeView.DataBind() +4 System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82 System.Web.UI.WebControls.BaseDataBoundControl.OnPreRender(EventArgs e) +22 System.Web.UI.WebControls.TreeView.OnPreRender(EventArgs e) +36 System.Web.UI.Control.PreRenderRecursiveInternal() +80 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Control.PreRenderRecursiveInternal() +171 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842
我想的代码的有用比特将是BuildSiteMap功能:
Public Overrides Function BuildSiteMap() As System.Web.SiteMapNode
Dim node As SiteMapNode = Nothing
SyncLock Me
node = TryCast(HttpRuntime.Cache("SiteMap"), SiteMapNode)
If node Is Nothing Then
MyBase.Clear()
Throw New Exception("Test")
node = New SiteMapNode(Me, "FO1", "default.cnt", "Home")
AddNode(node)
siteRoot = node
AddFolders(node)
AddFiles(node)
HttpRuntime.Cache.Insert("SiteMap", node, New SiteMapCacheDependency())
End If
Return node
End SyncLock
End Function
AddFolders()和AddFiles()只是做更多的相同,所以为了简洁起见,我会留下来,除非有人认为他们是非常重要的。
我想张贴在这里的树视图中的代码,但似乎该网站并不真的很喜欢这一点。我会说,我设置了DataSourceID属性,而不是在运行时分配给它的。我想两者兼得,似乎不有所作为。
我真的不知道还有什么可能是有用的,所以才让我知道如果你需要任何更多的细节。
现在我在想,如果这可能是一个线索,我的问题,或者如果它只是一个巧合。如果它是一个线索,我太密集弄明白。是否有此意义的其他人?
解决方案
事实证明,问题是一些代码,我不认为是值得张贴。看来,我发现每一个例子确实是这样的:
Protected Overrides Function GetRootNodeCore() As System.Web.SiteMapNode
Return siteRoot
End Function
原来,GetRootNodeCore()被调用几乎右出了大门,所以有时siteRoot是什么。因此,解决方案如下:
Protected Overrides Function GetRootNodeCore() As System.Web.SiteMapNode
If siteRoot Is Nothing Then
SyncLock Me
BuildSiteMap()
End SyncLock
End If
Return siteRoot
End Function
我不会采取信贷发现我自己,有人指给我在这里:的 http://forums.asp.net/p/1473236/3420805.aspx#3420805