我正在开发一个MVC3 / Razor页面,在我的_layout中我有
@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 :(得分:4)
尝试使用 @ Html.Partial
@section relatedBooksContainer
{
@{ Html.Partial("~/Views/Shared/Bookshelf.cshtml", Model.Books);}
}
答案 1 :(得分:0)
错误消息是关于模型中Bookshelf的类型和返回类型。
public IEnumerable<Book> Bookshelf()
{
var q = from book in bookshelf
select book;
IEnumerable<Book> myBooks = q.ToList<Book>();
return myBooks;
}
答案 2 :(得分:0)
提供的链接中的解决方案是否适用于您?
我无法让它发挥作用。那就是我无法通过ViewData [“MainView”]将数据从Layout.cshtml传递给partialview。这显然是一个功能,因为每个视图都应该拥有自己的ViewData obj。似乎ViewData并不像我想象的那样是全球性的。所以我在部分视图中从Layout中得到的ViewData [“MainView”]是空的......我最终找到了解决这个问题的方法,并且能够通过@Html将页面引用从Layout传递给Partialview。来自布局的动作调用 - &gt;控制器 - &gt; PartialView。我能够让我的部分视图访问并写入正确的渲染。但是我想在Layout.cshtml中多次调用相同的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);
}