سؤال

وأنا أعمل على أول مشروع 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top