MVC3 - RenderSection内的RenderPartial不起作用

时间:2011-05-06 21:04:28

标签: asp.net-mvc asp.net-mvc-3 partial-views

我正在开发一个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]'。

任何人都知道为什么会发生这种情况?还有其他方法可以达到这个目的吗?

3 个答案:

答案 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);
    }