문제

나는 처음으로 ASP.NET 프로젝트를 진행하고 있으며, 바로 깊은 끝에 던져진 것 같습니다. 내 모든 사이트 파일은 데이터베이스에 저장되어 있으므로 VirtualPathProvider를 사용하여 액세스 할 수 있습니다. 이 부분은 잘 작동하지만 사용자가 파일을 추가/삭제하기 때문에 모든 파일을 동적으로 선택하는 사이트 맵이 필요했습니다. 이를 위해 StanticsItemApprovider를 상속하는 클래스를 만들었고 마스터 페이지에 SiteEmapDatasource를 만들었고 TreeView를 사용했습니다. 대부분의 경우, 이것은 작동합니다. 페이지를로드하면 TreeView가 표시되고 모든 노드가 포함되어 있습니다. 그러나 때때로 TreeView는 완전히 비어 있습니다. 전혀 노드가 없습니다. TreeView를 콘텐츠 페이지에 복사했습니다. MasterPage가 그렇지 않은 경우에도 컨텐츠 페이지 TreeView는 항상 작동합니다. (또한 컨텐츠 페이지의 컨트롤이 데이터 소스를 복사하는 것을 잊어 버릴 때까지 마스터 페이지의 데이터 소스를 사용할 수 있다는 것을 몰랐습니다!)

디버깅을 시도하면 Code가 실제로 실행되고 있음을 스스로 증명하기 위해 SiteemApprovider의 BuildSitemap () 함수에 Throw Exception을 제외했습니다. 내가 찾은 것은 예외가 매번 맞았다는 것입니다. 그러나 스택 추적은 매번 동일하지 않았습니다.

대부분의 경우, 이것은 내가 얻은 것입니다.

[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 ()는 더 동일하게 수행하므로 Brevity를 위해 누군가가 중요하다고 생각하지 않으면 나가겠습니다.

여기에 TreeView의 코드를 게시하려고했지만 사이트가 실제로 마음에 들지 않는 것 같습니다. 런타임에 할당하는 대신 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