私は初めての 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 プロパティを設定していると言えます。私は両方の方法で試しましたが、違いはないようです。
他に何が役立つかはよくわかりませんので、詳細が必要な場合はお知らせください。
今、これが私の問題の手がかりになるのか、それとも単なる偶然なのか疑問に思っています. それが手がかりなら、私はそれを理解するには密度が高すぎます。これは他の誰かにとって意味がありますか?