MVCSiteMapProvider-node.MatchesRoute

MVCSiteMapProvider-node.MatchesRoute,mvcsitemapprovider,Mvcsitemapprovider,因此,我有一个web应用程序,其中定义了一系列路线。默认根目录如下所示: routes.Add(new Route("", new RouteValueDictionary (new { param1 = "Default",

因此,我有一个web应用程序,其中定义了一系列路线。默认根目录如下所示:

routes.Add(new Route("",  new RouteValueDictionary
                                     (new
                                         {
                                             param1 = "Default",
                                             param2 = "Default",
                                             controller = "Home",
                                             action = "Index"
                                         }), 
                                         null, 
                                         new RouteValueDictionary(new { namespaces = new[] { "MyApp.Web.Controllers" } }),
                                        myRouteHandler));
因此,理论上,当你点击url/时,myRouteHandler的实例就会启动。此处理程序根据用户上下文进行一些替换,特别是替换RequestContext.RouteData中的param1、param2值

现在,我正试图使用mvcsitemprovider使用
Html.MvcSiteMap().menu(3,1,true)构建我的菜单

我有一个带有以下xml的站点地图

<mvcSiteMapNode key="Default" title="Default" controller="RootNode" action="None" isDynamic="false">
    <mvcSiteMapNode key="Home" title="Home" controller="Home" action="Index"   preservedRouteParameters="param1,param2">    
据我所知,原因是节点无法将路由与RouteTable中定义的路由列表相匹配

SiteMapNode上的route values集合包含{[param1,ABC]}、{[param2,xyz]},其中RouteTable包含param1=Default、param2=Default,因此当它执行键和值相等性检查(MvcSiteMapProvider.Collections.Specialized.RouteValueDictionary第67行)时,无法找到匹配项

我不知道我是否已经很好地解释了这个问题,但是由于RouteHandler更改了路由数据,因此定义的路由与sitemapnode上的路由字典之间的比较永远不匹配


关于这个欢迎的想法和帮助

为什么会有一个“根节点”和一个“主页”?在您的项目中是否真的有一个名为“RootNodeController”的控制器,其操作名为“None”?如果是,请张贴。更好的办法是,用同样的问题构建一个小的演示,并将其发布到@GitHub或zip,然后让其可供下载。感谢您的评论,是的,确实有一个RootNode和一个主页。我猜这是客户机使用MvcSiteMap.Core(我想是mvcsitemproviderv1)时遗留下来的,尽管我怀疑这是他们的决定,不是强迫的。最后,为了处理路由表路由数据和正在执行的url之间的差异,我扩展了MvcSiteMapProvider中的一个方法。它解释了定义和基于用户上下文在运行时替换的值之间的差异。很抱歉,我不能在这方面提供更多帮助。顺便说一句,继承RouteBase比构建自己的路由处理程序更好,因为它设计用于处理传入和传出路由,因此它将同时进行匹配和构建URL。更不用说,您可以轻松注册多个RouteBase实现,以更好地分离关注点。感谢您的建议。我将来会记住这一点。目前,我无法在我的客户端应用程序中重构路由,因为我需要限制任何更改的连锁反应。顺便说一句,一旦我了解了MVCSiteMapProvider的扩展点,就不难用我自己的自定义实现替换内置的默认值。总的来说,这是一个非常容易组合和扩展的库。
Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 1390:        public static ISiteMapNode GetNodeAtLevel(ISiteMapNode startingNode, int level, bool allowForwardSearch)
Line 1391:        {
Line 1392:            var startingNodeLevel = startingNode.GetNodeLevel();
Line 1393:            if (startingNodeLevel == level)
Line 1394:            {

Source File: c:\OpenSource\MvcSiteMapProvider\src\MvcSiteMapProvider\MvcSiteMapProvider\Web\Html\MenuHelper.cs    Line: 1392