2012-10-11 66 views
1

我目前正在使用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共享視圖的作用是相矛盾的!

我的代碼中的錯誤在哪裏?

回答

0

嘗試設置控制器和動作創建DynamicNode時:

DynamicNode node = new DynamicNode(); 
node.Controller = "ControllerName"; 
node.Action = "ActionName"; 
node.ParentKey = "News"; 
node.Title = article.PostTitle; 
node.RouteValues.Add("id", article.Post_ID); 
returnValue.Add(node); 

使用該信息來選擇正確的路線。

+0

感謝您的回答,不幸的是,您的建議不會改變上述行爲。 – Furnica

0

在你的索引操作中,你有一個ID參數,如果你刪除它並應用@Xharze的建議,這是否有任何區別。在web.config中是否有專門針對博客/帖子定義的路線?

0

從您的控制器操作中刪除SiteMapPreserveRouteDataAttribute。

SiteMapPreserveRouteDataAttribute(現在已被棄用)不能與動態節點一起使用。而且沒有必要,因爲您無論如何都要在動態節點提供程序中明確添加RouteValues。

相關問題