我的工作我的第一次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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top