MVC SitemapProvider: NullReferenceException after updating (!) Dynamic node pages

I am using ASP.NET MVC SiteMapProvider 3.0 on my MVC3 page (.NET Framework 4.0). I switched from SiteMapProvider v2 to 3.0 during development, but had the described problem in v2 as well.

SiteMapProvider is listed in the Web.config file as follows:

<siteMap defaultProvider="MvcSiteMapProvider" enabled="true"> <providers> <clear/> <add name="MvcSiteMapProvider" type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" siteMapFile="~/Web.Sitemap" securityTrimmingEnabled="false" cacheDuration="5" enableLocalization="false" scanAssembliesForSiteMapNodes="true" skipAssemblyScanOn="" attributesToIgnore="bling,visibility" nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider" controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider" actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider" aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider" siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider" siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider" siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider"/> </providers> </siteMap> 

The page uses the main and administrative areas, and the site map contains nodes for both of these areas, including some DynamicNodes:

 <?xml version="1.0" encoding="utf-8" ?> <mvcSiteMap xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0" enableLocalization="false"> <mvcSiteMapNode title="Startseite" controller="Home" action="Index" changeFrequency="Monthly" updatePriority="Normal"> <!--Main Page--> <mvcSiteMapNode title="Produktkatalog" controller="Products" action="Index" > <mvcSiteMapNode title="FahrrΓ€der" controller="Bikes" action="List" key="bikes_" > <mvcSiteMapNode title="Marken" controller="Bikes" action="List" dynamicNodeProvider="Grauthoff.WebUI.Infrastructure.BikeBrandsDynamicNodeProvider, Grauthoff.WebUI"> <mvcSiteMapNode title="Details" controller="Bikes" action="Details" dynamicNodeProvider="Grauthoff.WebUI.Infrastructure.BikeDetailsDynamicNodeProvider, Grauthoff.WebUI" /> </mvcSiteMapNode> <mvcSiteMapNode title="Kategorien" controller="Bikes" action="List" dynamicNodeProvider="Grauthoff.WebUI.Infrastructure.BikeCategoriesDynamicNodeProvider, Grauthoff.WebUI" /> </mvcSiteMapNode> <mvcSiteMapNode title="Absperrpfosten" controller="Barriers" action="List" key="barriers_" > <mvcSiteMapNode title="Kategorien" controller="Barriers" action="List" dynamicNodeProvider="Grauthoff.WebUI.Infrastructure.BarrierCategoriesDynamicNodeProvider, Grauthoff.WebUI" /> </mvcSiteMapNode> <mvcSiteMapNode title="Tresore" controller="Safes" action="List" key="safes_" > <mvcSiteMapNode title="Marken" controller="Safes" action="List" dynamicNodeProvider="Grauthoff.WebUI.Infrastructure.SafeBrandsDynamicNodeProvider, Grauthoff.WebUI"> <mvcSiteMapNode title="Details" controller="Safes" action="Details" dynamicNodeProvider="Grauthoff.WebUI.Infrastructure.SafeDetailsDynamicNodeProvider, Grauthoff.WebUI" /> </mvcSiteMapNode> <mvcSiteMapNode title="Kategorien" controller="Safes" action="List" dynamicNodeProvider="Grauthoff.WebUI.Infrastructure.SafeCategoriesDynamicNodeProvider, Grauthoff.WebUI" /> </mvcSiteMapNode> </mvcSiteMapNode> <mvcSiteMapNode title="Marken" controller="Brands" action="Index" /> [...] <!--Admin Area--> <mvcSiteMapNode title="Start" controller="Home" action="Index" area="Admin" /> [...] </mvcSiteMap> 

On the main page, I use

<%: Html.MvcSiteMap (). Menu (false)%>

to display page navigation using the following DisplayTemplate screen:

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl`1[ [MvcSiteMapProvider.Web.Html.Models.MenuHelperModel,MvcSiteMapProvider] ]" %> <%--this controls the output of the main navigation bar on the main page--%> <ul id="MainNav"> <% foreach (var node in Model.Nodes) { %> <%--skip AdminArea nodes--%> <% if (node.Area.Equals("Admin")) { %> <% continue; %> <% } %> <%--hightlight active node using a CSS class--%> <% if (node.IsCurrentNode || node.IsInCurrentPath || (SiteMap.CurrentNode != null && SiteMap.CurrentNode.Url.Equals(node.Url))) { %> <li class="naviActive"><%=Html.DisplayFor(m => node)%> <% } %> <% else { %> <li class="naviInactive"><%=Html.DisplayFor(m => node)%> <% } %> </li> <% } %> </ul> 

As a rule, everything works fine, but I have one big problem in the showstopper style that I could not solve yet: If I open one of the DynamicNode-related sites in the browser and just stay idle for several minutes (or if I rebuild solution in VS in the background) and then refresh the page in the browser, I always get a System.NullReferenceException using the following source error and stacktrace:

 Zeile 29: <div id="navi"> Zeile 30: <%--Navigation--%> Zeile 31: <%: Html.MvcSiteMap().Menu(false)%> Zeile 32: </div> Zeile 33: </div> [NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.] MvcSiteMapProvider.DefaultSiteMapProvider.GetSiteMapNodeFromXmlElement(XElement node, SiteMapNode parentNode) in D:\Downloads\smp\Main\src\MvcSiteMapProvider\MvcSiteMapProvider\DefaultSiteMapProvider.cs:1348 MvcSiteMapProvider.DefaultSiteMapProvider.BuildSiteMap() in D:\Downloads\smp\Main\src\MvcSiteMapProvider\MvcSiteMapProvider\DefaultSiteMapProvider.cs:483 [MvcSiteMapException: An error occured while building the sitemap... Check the InnerException for more details.] MvcSiteMapProvider.DefaultSiteMapProvider.BuildSiteMap() in D:\Downloads\smp\Main\src\MvcSiteMapProvider\MvcSiteMapProvider\DefaultSiteMapProvider.cs:563 MvcSiteMapProvider.DefaultSiteMapProvider.GetRootNodeCore() in D:\Downloads\smp\Main\src\MvcSiteMapProvider\MvcSiteMapProvider\DefaultSiteMapProvider.cs:131 MvcSiteMapProvider.DefaultSiteMapProvider.get_RootNode() in D:\Downloads\smp\Main\src\MvcSiteMapProvider\MvcSiteMapProvider\DefaultSiteMapProvider.cs:103 MvcSiteMapProvider.Web.Html.MenuHelper.Menu(MvcSiteMapHtmlHelper helper, Boolean showStartingNode) in D:\Downloads\smp\Main\src\MvcSiteMapProvider\MvcSiteMapProvider\Web\Html\MenuHelper.cs:45 ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in d:\inetpub\vhosts\grauthoff-shop.de\httpdocs\Views\Shared\Site.Master:31 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 System.Web.UI.Control.Render(HtmlTextWriter writer) +10 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 System.Web.UI.Page.Render(HtmlTextWriter writer) +29 System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +43 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060 

This happens both in debug mode and in release mode, and even on my remote web server. Obviously, this is preventing me from publishing the project. Since I have no idea what might cause this, I am extremely grateful for any help!

€ dit 06/01/2011: I used to use build 3.1.0 RC, but now I have connected the SVN 3.1.0 branch to my project in order to be able to debug the exception. I found out that the exception occurs in the method

protected MvcSiteMapNode GetSiteMapNodeFromXmlElement (XElement node, SiteMapNode parentNode)

in the following lines, where defaultValue.Value is null (siteMapNode and defaultValue are not null):

 Line 1379: if (siteMapNode[defaultValue.Key] == null) Line 1380: { Line 1381: siteMapNode[defaultValue.Key] = defaultValue.Value.ToString(); Line 1382: } 

I also learned that after an error has occurred, you cannot repeat the action of the main controller, and not refresh the page in the browser, and not open a new browser window or tab. First you need to request an action with the URL of a non-dynamic node at the top level of the Sitemap hierarchy, and then you can request the dynamic child of the node again. This is almost like a caching issue or how some sitemap is destroyed by the GC and then not recreated properly.

+1
source share
1 answer

This should be fixed with release 3.1. If not, report the error on the CodePlex website.

+1
source

Source: https://habr.com/ru/post/1446255/


All Articles