【问题标题】:Can't get DynamicNodeProvider to work无法让动态节点提供程序工作
【发布时间】:2012-11-13 03:07:06
【问题描述】:

我按照here 中描述的说明进行操作,但没有生成菜单。

我在_Layout.cshtml 文件中添加了以下内容:

@Html.MvcSiteMap().Menu();

Mvc.sitemap 文件中的静态链接会显示在菜单中。但是DynamicSiteMap 节点没有,而且我在DynamicNodeProviderBase.GetDynamicNodeCollection 方法中放置了一个断点,它并没有停在那里。

我对 MVC 很陌生,所以它可能是一个显而易见的解决方案,我会遗漏什么?

查看有关此问题的更多信息here

更新

我还尝试生成面包屑(调用@Html.MvcSiteMap().SiteMapPath()),但没有生成任何内容,并且根本没有调用上述方法。

我的想法是制作一个纯粹由应用程序生成和控制的菜单/站点地图,没有静态菜单项或节点。

更新

我也在尝试使用here 描述的属性,但它不起作用:

[MvcSiteMapNodeAttribute(Title = "Checkout complete", ParentKey = "Checkout")]

【问题讨论】:

    标签: asp.net-mvc mvcsitemapprovider


    【解决方案1】:

    这应该可以正常工作。确保您的 web.config 看起来像这样:

          <siteMap defaultProvider="MvcSiteMapProvider" enabled="true">
              <providers>
                <clear />
                <add name="MvcSiteMapProvider" 
                     type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" 
                     siteMapFile="~/Mvc.Sitemap" securityTrimmingEnabled="true" cacheDuration="5" 
                     enableLocalization="true" scanAssembliesForSiteMapNodes="true" includeAssembliesForScan="" 
                     excludeAssembliesForScan="" attributesToIgnore="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>
    

    重要的是 siteMapFile 设置正确。另外,请确保在您的 .sitemap 文件(在我的情况下为 Mvc.Sitemap)中设置正确:

    <?xml version="1.0" encoding="utf-8" ?>
    <mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0"
                xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0 MvcSiteMapSchema.xsd"
                enableLocalization="true">
    
      <mvcSiteMapNode title="Home" controller="Home" action="Index">
        <mvcSiteMapNode title="About" controller="Home" action="About"/>
          <mvcSiteMapNode
          title="Details"
          action="Present"
          dynamicNodeProvider="MvcApplication3.ItemDetailsDynamicNodeProvider, MvcApplication3" />
      </mvcSiteMapNode>
    
    </mvcSiteMap>
    

    这里的重要一点是 dynamicNodeProvider 类型和程序集拼写正确并且位置正确。

    这里是 ItemDetailsDynamicNodeProvider 的完整性

    public class ItemDetailsDynamicNodeProvider : DynamicNodeProviderBase
        {
            public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
            {
                var repository = new Repository();
    
                foreach (var item in repository.GetItems())
                {
                    var node = new DynamicNode(item.Slug, item.DisplayName);
                    node.RouteValues.Add("id", item.Slug);
    
                    System.Diagnostics.Debug.WriteLine(item.Slug);
    
                    yield return node;
                }
            }
        }
    
        public class Repository
        {
            public IEnumerable<Something> GetItems()
            {
                yield return new Something { Slug = "Slug1", DisplayName = "DisplayName1"};
                yield return new Something { Slug = "Slug2", DisplayName = "DisplayName2" };
            }
        }
    
        public class Something
        {
            public string Slug { get; set; }
            public string DisplayName { get; set; }
        }
    

    【讨论】:

    • 好的,如果我添加你的 Mvc.sitemap 内容,它会起作用,我的问题是为什么我必须创建 XML?我只想使用动态提供者创建菜单,为什么地图必须知道我有一个 HomeController?
    • 感谢这篇文章对我的帮助。添加 node.RouteValues.Add("id", item.Slug);为我工作
    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多