2

私は初めての ASP.Net プロジェクトに取り組んでいますが、すぐに深いところに投げ込まれたようです。私のサイト ファイルはすべてデータベースに保存されているため、VirtualPathProvider を使用してアクセスしています。その部分はうまく機能しますが、ユーザーがファイルを追加/削除するため、すべてのファイルを動的に取得するサイト マップが必要でした。そのために、StaticSiteMapProvider を継承するクラスを作成し、マスター ページに SiteMapDataSource を作成し、それを使用する TreeView を作成しました。ほとんどの場合、これでうまくいきます。ページをロードすると、TreeView が表示され、必要なすべてのノードが含まれています。ただし、時々 TreeView は完全に空白になり、ノードがまったくありません。TreeView をコンテンツ ページにコピーしました。MasterPage が機能しない場合でも、コンテンツ ページの TreeView は常に機能します。(私もしませんでした。

それをデバッグしようとして、コードが実際に実行されていることを証明するために、SiteMapProvider の BuildSiteMap() 関数に例外をスローしました。私が見つけたのは、毎回例外が発生したことです。ただし、スタック トレースは毎回同じではありませんでした。

ほとんどの場合、これは私が得たものです:

[例外: テスト]
    c:\inetpub\wwwroot\App_Code\clsSiteMap.vb:49 の ADEM.clsSiteMap.BuildSiteMap()
    System.Web.StaticSiteMapProvider.GetChildNodes(SiteMapNode ノード) +54
    System.Web.SiteMapNode.get_ChildNodes() +27
    System.Web.UI.WebControls.SiteMapDataSource.GetNodes(SiteMapNode ノード) +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 ノード) +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 (ブール値 includeStagesBeforeAsyncPoint、ブール値 includeStagesAfterAsyncPoint) +842

ただし、TreeView が空白になるのとほぼ同じ頻度で、次のようになりました。

    [例外: テスト]
    c:\inetpub\wwwroot\App_Code\clsSiteMap.vb:49 の ADEM.clsSiteMap.BuildSiteMap()
    System.Web.StaticSiteMapProvider.FindSiteMapNode(String rawUrl) +133
    System.Web.SiteMapProvider.FindSiteMapNode(HttpContext コンテキスト) +54
    System.Web.SiteMapProvider.get_CurrentNode() +35
    System.Web.UI.WebControls.TreeView.DataBindNode(TreeNode ノード) +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 (ブール値 includeStagesBeforeAsyncPoint、ブール値 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 プロパティを設定していると言えます。私は両方の方法で試しましたが、違いはないようです。

他に何が役立つかはよくわかりませんので、詳細が必要な場合はお知らせください。

今、これが私の問題の手がかりになるのか、それとも単なる偶然なのか疑問に思っています. それが手がかりなら、私はそれを理解するには密度が高すぎます。これは他の誰かにとって意味がありますか?

4

1 に答える 1