2011-05-06 50 views
4

我工作的MVC3 /剃刀頁面上,在我的_layout我有MVC3 - 裏面的RenderPartial不RenderSection工作

@RenderSection("relatedBooksContainer", false) 

在另一頁我用那款有:

@section relatedBooksContainer 
{ 
@{ Html.RenderPartial("~/Views/Shared/Bookshelf.cshtml", Model.Books);} 
} 

這不起作用。從我讀過的內容來看,RenderSection只會深入一層 - 在相關部分沒有Html.RenderPartial的概念,只會返回一個空白區域。我在http://forums.asp.net/t/1590688.aspx/2/10上讀到的解決方法是使用RenderPage並將返回的HTML提交給一個字符串,然後在渲染部分輸出該字符串......這是可行的!也就是說,直到我通過一個模型的部分頁面,那麼它拋出一個錯誤說:

傳遞到 字典型號產品類型 「TheBookshelf.ViewModels.BookshelfViewModel」, 但本詞典需要 類型的項目 'System.Collections.Generic.List`1 [TheBookshelf.EntityModel.Book]'。

任何人都知道爲什麼會發生這種情況?還有其他方法可以實現嗎?

+0

所以「@section relatedBooksContainer」是在部分? – 2011-05-06 21:19:21

+0

它看起來好像你需要使用嵌套佈局... – 2011-05-06 21:23:58

+0

「所以」@section relatedBooksContainer「是在部分?」 ----代碼的這一部分位於它自己的常規獨立頁面中,但「〜/ Views/Shared/Bookshelf.cshtml」是常規頁面調用的部分頁面。這似乎打破了MVC。另外,我不能將它放在_Layout文件中,因爲實現「@section relatedBooksContainer」的每個頁面都會傳入它自己的模型,所以在沒有傳遞模型的情況下調用部分頁面也不會起作用。 – boolean 2011-05-07 03:12:27

回答

0

錯誤消息是關於模型中書架的類型和返回類型。

public IEnumerable<Book> Bookshelf() 
    { 
     var q = from book in bookshelf 
       select book; 
     IEnumerable<Book> myBooks = q.ToList<Book>(); 

     return myBooks; 
    } 
0

在提供的鏈接中爲您做了解決方案嗎?

我無法讓它工作。那是我無法得到ViewData [「MainView」]將數據從Layout.cshtml傳遞到partialview。這顯然是一個功能,因爲每個視圖都應該擁有自己的ViewData obj。看來ViewData不像我想象的那樣是全球性的。因此,我在部分視圖中從佈局的ViewData [「MainView」]中得到的內容爲空......我最終找到了解決此問題的方法,並且能夠通過@Html將佈局中的頁面引用傳遞給Partialview。從佈局 - >控制器 - >部分視圖進行操作調用。我能夠獲得我的partialview訪問和寫入正確的rendersection。不過,我想在我的Layout.cshtml中多次調用相同的partialview。在Layout中再次調用相同的Partialview不起作用,因爲自第一次調用和渲染更新以來,對佈局的引用已發生更改。因此,代碼如下所示:

Layout.cshtml:

@RenderSection("Top", false) 
@Html.Action("Load", "Home", new { viewname = "_testPartialView", pageref = this }) 
@Html.Action("Load", "Home", new { viewname = "_testPartialView", pageref = this }) 

管窺:

@Model Models.testModel 
@Model.Content 

@{ 

    var md = (System.Web.Mvc.WebViewPage)@Model.pageRef; 

    @*This check fails in subsequent loads as we get null*@ 
    if(md.IsSectionDefined("Footer")) { 
     md.RenderSection("Footer"); 
    } 
    else { 
     md.DefineSection("Footer",() => { md.WriteLiteral("<div>My Contents</div>"); }); 
    } 

} 

} 

控制器:

public ActionResult Load(string viewname, System.Web.Mvc.WebViewPage pageRef) 
    {    
     var model = new Models.testModel { Content = new HtmlString("time " + i++.ToString()), pageRef = pageRef }; 
     return PartialView(viewname, model); 
    } 
3

嘗試@ Html.Partial代替

@section relatedBooksContainer 
{ 
    @{ Html.Partial("~/Views/Shared/Bookshelf.cshtml", Model.Books);} 
}