ASP.Net تحكم TreeView على MasterPage ليست دائما بالسكان
-
22-07-2019 - |
سؤال
وأنا أعمل على أول مشروع ASP.Net، ويبدو لي أن ألقيت في نهاية العميق على الفور. يتم تخزين كافة الملفات على موقعي في قاعدة بيانات، لذلك أنا باستخدام VirtualPathProvider لللوصول إليها. هذا الجزء يعمل بشكل جيد، ولكن بعد ذلك أنا في حاجة إلى خريطة الموقع التي من شأنها أن اختيار حيوي لكافة الملفات منذ المستخدم سيضيف / حذف الملفات لأنها تذهب. للقيام بذلك، أنا خلقت فئة يرث StaticSiteMapProvider، وخلق SiteMapDataSource على بلدي الصفحات الرئيسية، وTreeView إلى استخدامه. بالنسبة للجزء الأكبر، وهذا يعمل. عند تحميل الصفحة ترى تريفيف وأنه يحتوي على كافة العقد أنه من المفترض أن. ومع ذلك، بين الحين والآخر في تريفيف فارغ تماما - لا العقد على الإطلاق. حتى أنا نسخ تريفيف إلى صفحة المحتوى. وتريفيف محتوى الصفحة يعمل دائما، حتى عندما يفعل MasterPage لا. (أيضا لم أكن أعرف عنصر تحكم في محتوى الصفحة يمكن استخدام مصدر البيانات على صفحة رئيسية حتى أنني نسيت أن نسخ مصدر البيانات!)
ومحاولة تصحيح ذلك، أضع استثناء رمي في وظيفة لي BuildSiteMap () في SiteMapProvider فقط أن أثبت لنفسي أن الرمز كان يعمل في الواقع. ما وجدته هو أن الاستثناء أصيبت كل مرة واحدة. ومع ذلك، كان تتبع المكدس يست هي نفسها في كل مرة.
ومعظم الوقت، وهذا هو ما حصلت عليه:
[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
ولكن، حول كثير من الأحيان كما في تريفيف أن يأتي فارغا، حصلت على هذا:
[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
و
وأنا لن تأخذ الائتمان للعثور على أنه في بلدي، وأشار أحدهم بها لي هنا: <لأ href = "http://forums.asp.net/p/1473236/3420805.aspx#3420805" يختلط = "نوفولو noreferrer"> http://forums.asp.net/p/1473236/3420805.aspx#3420805