我按照here所述的说明操作,但没有生成菜单。
我将以下内容添加到我的_Layout.cshtml
文件中:
@Html.MvcSiteMap().Menu();
如果Mvc.sitemap
文件中的静态链接显示在菜单中,会发生什么。但是DynamicSiteMap
节点没有,而且我在DynamicNodeProviderBase.GetDynamicNodeCollection
方法中放置了一个断点,它并不止于此。
我对MVC很陌生,所以它可能是一个明显的解决方案,我可能会缺少什么?
详细了解此问题here。
更新:
我还尝试生成一个痕迹(调用@Html.MvcSiteMap().SiteMapPath()
)并且没有生成任何内容,并且根本没有调用上面提到的方法。
我的想法是制作一个纯粹由应用程序生成和控制的菜单/站点地图,没有静态菜单项或所有节点。
更新
我也在尝试使用here描述的属性,但它不起作用:
[MvcSiteMapNodeAttribute(Title = "Checkout complete", ParentKey = "Checkout")]
答案 0 :(得分:2)
这应该可以正常工作。确保您的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; }
}