我目前正在使用Maartenba's MVC Sitemap Provider在MVC3 Razor應用程序中實現麪包屑。當我嘗試爲博客文章創建動態節點時,就會出現問題。我想實現的是顯示首頁>博客的博客頁面,首頁>博客>BlogPostTitle爲後頁,BlogPostTitle是當前顯示的文章的標題。我實際得到的是:主頁>博客無論是博客頁面還是任何帖子頁面。MVCSiteMapProvider動態節點不顯示
爲了測試動態節點的生成,我還在_Layout上調用了@ Html.MvcSiteMap()。Menu(false,true,true)。顯示的菜單確認節點正確生成:
- 首頁
- 關於
- 博客
- 文章#1標題
- 文章#2標題
- 聯繫
不過,@ Html.MvcSiteMap()。SiteMapPath()顯示主頁>博客無論是博客頁面還是文章。
下面是代碼:
網站地圖:
<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)
};
}
}
BlogPostCOntroller
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);
}
_layout
<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>
}
_編輯_ 我發現,如果我從_La刪除@Html.MvcSiteMap().SiteMapPath()
然後將它放在博客「索引」視圖中並在「詳細信息」視圖中,麪包屑正確顯示當前位置。
但是這意味着我需要把它放在項目的每個頁面上,這與_Layout共享視圖的作用是相矛盾的!
我的代碼中的錯誤在哪裏?
感謝您的回答,不幸的是,您的建議不會改變上述行爲。 – Furnica