【问题标题】:MVC SitemapProvider: NullReferenceException after refreshing(!) dynamic node pagesMVC SitemapProvider:刷新(!)动态节点页面后出现 NullReferenceException
【发布时间】:2011-05-29 18:49:29
【问题描述】:

我在我的 MVC3 页面 (.NET Framework 4.0) 中使用 ASP.NET MVC SiteMapProvider 3.0。我在开发过程中从 SiteMapProvider v2 切换到 3.0,但在 v2 中也遇到了描述的问题。

SiteMapProvider 在 Web.config 中指定如下:

<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>

该页面使用一个主区域和一个管理区域,站点地图包含这两个区域的节点,包括一些动态节点:

<?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>

在主页中,我使用的是

使用以下 DisplayTemplate 呈现页面导航:

<%@ 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>

通常一切正常,但我有一个大问题,我还无法解决: 如果我在浏览器中打开一个与 DynamicNode 相关的站点并闲置几分钟(或者如果我在后台在 VS 中重建解决方案),然后在浏览器中刷新页面,我总是会得到一个 System.NullReferenceException以下源错误和堆栈跟踪:

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

这发生在调试和发布模式下,甚至在我的远程网络服务器上。显然,这会阻止我发布该项目。由于我不知道是什么原因造成的,因此我非常感谢您的帮助!

€dit 01.06.2011: 我之前使用的是 3.1.0 RC 发布程序集,但现在将 3.1.0 SVN 分支附加到我的项目以便能够调试异常。发现异常发生在方法中

受保护的 MvcSiteMapNode GetSiteMapNodeFromXmlElement(XElement 节点,SiteMapNode 父节点)

defaultValue.Value 为空(siteMapNode 和 defaultValue 不为空)的以下行中:

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

我还发现,一旦发生错误,就不能再次请求底层控制器操作——不能通过刷新浏览器中的页面,也不能通过打开新的浏览器窗口或选项卡。您首先必须请求具有站点地图层次结构中上层非动态节点 URL 的操作,然后您可以再次请求动态子节点。这似乎是一个缓存问题,或者某些站点地图对象被 GC 销毁,然后无法正确重新创建。

【问题讨论】:

    标签: asp.net-mvc sitemap mvcsitemapprovider


    【解决方案1】:

    这应该在 3.1 版本中得到修复。如果没有,请在 CodePlex 网站上发布错误。

    【讨论】:

    • 谢谢!我们目前正在测试新版本,到目前为止一切正常。我会在接下来的几天内向您报告。
    • 不,不幸的是错误仍然发生。它不像以前那样经常发生,但仍然会发生。
    • 嗯烦人...是否可以检查异常中哪个对象为空? [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.DefaultSiteMap D:\Downloads\smp\Main\src\MvcSiteMapProvider\MvcSiteMapProvider\DefaultSiteMapProvider.cs:483中的BuildSiteMap()
    • 你能查一下最新的 SVN 源码吗?
    • @maartenba,请帮帮我,我很绝望:stackoverflow.com/questions/13399537/…
    猜你喜欢
    • 2022-12-09
    • 2021-11-03
    • 2011-04-30
    • 1970-01-01
    • 2020-07-23
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多