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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top