ASP.Net TreeView-Steuerelement auf Masterpage ist nicht immer bevölkerten
-
22-07-2019 - |
Frage
Ich arbeite an meinem ersten jemals ASP.Net Projekt, und ich scheine in dem tiefen Ende sofort geworfen wurde. Alle meine Site-Dateien werden in einer Datenbank gespeichert, so dass ich bin mit einem VirtualPathProvider auf sie zuzugreifen. Das Teil funktioniert gut, aber dann brauchte ich eine Sitemap, die dynamisch alle Dateien abholen würde, da der Benutzer hinzufügen / löschen Dateien, wie sie gehen. Um das zu tun, habe ich eine Klasse, die StaticSiteMapProvider erbt, schaffte eine Sitemap auf meiner Master-Seite und ein TreeView, es zu benutzen. In den meisten Fällen funktioniert dies. Wenn Sie die Seite laden, sehen Sie die TreeView und es enthält alle Knoten angenommen wird. ab und zu ist jedoch die TreeView vollständig leer - keine Knoten überhaupt. Ich kopierte sogar die TreeView in einer Content-Seite. Der Content-Seite TreeView funktioniert immer, auch wenn die Masterpage nicht. (Auch habe ich keine Kontrolle auf einer Content-Seite wissen konnte, eine Datenquelle auf einer Masterseite verwenden, bis ich die Datenquelle zu kopieren vergessen!)
Der Versuch, zu debuggen, dass, legte ich einen Wurf Ausnahme in meiner BuildSiteMap () Funktion in der Sitemap nur um mich zu beweisen, dass der Code tatsächlich ausgeführt wurde. Was ich fand, war, dass die Ausnahme jedes Mal getroffen wurde. Allerdings war der Stack-Trace nicht jedes Mal die gleiche.
Die meiste Zeit ist es das, was ich habe:
[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
Doch etwa so oft wie das TreeView leer kommen würde, ich habe dies:
[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
Ich denke, die nützlich Stück Code die BuildSiteMap Funktion sei:
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 () und AddFiles () nur mehr von der gleichen tun, so der Kürze halber ich sie verlassen werden, es sei denn jemand denkt, sie sind wichtig.
Ich habe versucht, den Code für die treeview hier posten, aber es scheint der Ort nicht wirklich so. Ich werde sagen, dass ich die DataSourceID Eigenschaft habe die Einrichtung, anstatt es zur Laufzeit zuweisen. Ich habe versucht, es in beide Richtungen, scheint keinen Unterschied zu machen.
Ich bin nicht wirklich sicher, was sonst noch nützlich sein könnte, so lass es mich wissen, wenn Sie weitere Informationen benötigen.
Jetzt frage ich mich nach links, wenn dies ein Hinweis auf mein Problem sein könnte oder ob es nur ein Zufall. Wenn es ein Anhaltspunkt ist, bin ich zu dicht, um es herauszufinden. Ist irgendetwas davon Sinn jemand anderes machen?
Lösung
Wie sich herausstellte, war das Problem in einem Stück Code, dass ich es nicht wert Posting war dachte. Es scheint, dass jedes Beispiel, das ich gefunden habe, tut etwas wie folgt aus:
Protected Overrides Function GetRootNodeCore() As System.Web.SiteMapNode
Return siteRoot
End Function
Es stellt sich heraus, dass GetRootNodeCore () ziemlich rechts aus dem Tor genannt wird, so dass manchmal siteRoot ist nichts. So ist die Lösung wie folgt:
Protected Overrides Function GetRootNodeCore() As System.Web.SiteMapNode
If siteRoot Is Nothing Then
SyncLock Me
BuildSiteMap()
End SyncLock
End If
Return siteRoot
End Function
Ich werde nicht nehmen Kredit für die Suche nach, dass auf meinem eigenen, jemand darauf es hier ich: http://forums.asp.net/p/1473236/3420805.aspx#3420805