我目前正在使用Maartenba 的 MVC Sitemap Provider在 MVC3 Razor 应用程序中实现面包屑。当我尝试为博客文章创建动态节点时,就会出现问题。我想要实现的是为博客页面显示Home>Blog和为帖子页面显示 Home >Blog> BlogPostTitle,其中BlogPostTitle是当前显示的帖子的标题。我实际得到的是:主页>博客页面和任何帖子页面的博客。
为了测试动态节点的生成,我还在_Layout 中包含了对@Html.MvcSiteMap().Menu(false, true, true) 的调用。显示的菜单确认节点已正确生成:
- 家
- 关于
- 博客
- 文章 #1 标题
- 文章 #2 标题
- 接触
尽管如此,@Html.MvcSiteMap().SiteMapPath() 仍然为博客页面和文章显示Home>Blog 。
这是代码:
网站地图:
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="About" controller="Home" action="About"/>
<mvcSiteMapNode title="Blog" controller="BlogPost" action="Index" key="News" >
<mvcSiteMapNode title="" controller="BlogPost" action="Details" dynamicNodeProvider ="MyApp.Helpers.BlogPostDynamicNodeProvider, myApp" />
</mvcSiteMapNode>
<mvcSiteMapNode title="Contact" controller="Home" action="Contact"/>
</mvcSiteMapNode>
动态节点提供者:
public class BlogPostDynamicNodeProvider : DynamicNodeProviderBase
{
public BlogPostRepository _repository = new BlogPostRepository();
public List<BlogPost> articles = new List<BlogPost>();
public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
{
articles = _repository.FindAllBlogPosts();
var returnValue = new List<DynamicNode>();
foreach (var article in articles)
{
DynamicNode node = new DynamicNode();
node.ParentKey = "News";
node.Title = article.PostTitle;
node.RouteValues.Add("id", article.Post_ID);
returnValue.Add(node);
}
return returnValue;
}
public override CacheDescription GetCacheDescription()
{
return new CacheDescription("BlogPostDynamicNodeProvider")
{
SlidingExpiration = TimeSpan.FromMinutes(1)
};
}
}
博客帖子控制器
public ViewResult Index(long? BlogPost_ID)
{
var BlogPostList = new PagedData<BlogPost>();
BlogPostList.Data = repository.FindAllBlogPostsPaged(1, 3, 1);
BlogPostList.NumberOfPages = Convert.ToInt32(Math.Ceiling((double)repository.NumberOfPosts(1) / 3));
BlogPostList.CurrentPage = 1;
BlogPost pBlogPost = new BlogPost();
pBlogPost.PostDate = DateTime.Now;
return View(new BlogPostPagedViewModel(pBlogPost, repository.FindAllBlogPosts()
new SelectList(ctgRepository.FindAllBlogCategories(), "Category_ID", "Category_Name")));
}
[SiteMapPreserveRouteData]
public ActionResult Details(long id)
{
BlogPost post = repository.FindABlogPostByID(id);
return PartialView("_Details", post);
}
_布局
<div id="pagecontent">
@Html.MvcSiteMap().Menu(false, true, true) <!-- for test purpose only -->
@Html.MvcSiteMap().SiteMapPath()
@Html.Partial("_PagedList", Model.BlogPostList)
</div><!-- page blogcontent -->
博客索引视图
<div id="blogcontent">
@Html.Partial("_PagedList", Model.BlogPostList)
</div><!-- end blogcontent -->
博客_PagedList局部视图
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "blogcontent", InsertionMode = InsertionMode.Replace }))
{
foreach (var item in Model.Data)
{
<h2 class="posttitle">
@Ajax.ActionLink(item.PostTitle, "Details", "BlogPost", new { id = item.Post_ID }, new AjaxOptions { UpdateTargetId = "blogcontent" }, null)
</h2>
}
}
详情视图
@model MyApp.Models.BlogPost
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "blogcontent", InsertionMode = InsertionMode.Replace }))
{
<div class="blogpost">
...
</div>
}
_ 编辑 _ 我发现,如果我@Html.MvcSiteMap().SiteMapPath()
从 _Layout 中删除并将其放置在博客索引视图和详细信息视图中,则面包屑会正确显示当前位置。
但这意味着我需要将它放在项目的每个页面上,这与 _Layout 共享视图的作用相矛盾!
我的代码中的错误在哪里?