MVC3 - RenderPartial внутри RenderSection не работает - PullRequest
4 голосов
/ 07 мая 2011

Я работаю над страницей 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 ]

4 голосов
/ 11 апреля 2013

Попробуйте вместо @Html.Partial

@section relatedBooksContainer
{
  @{ Html.Partial("~/Views/Shared/Bookshelf.cshtml", Model.Books);} 
}
0 голосов
/ 01 декабря 2011

у вас работает решение по предоставленной ссылке?

Я не мог заставить его работать. То есть я не смог заставить ViewData ["MainView"] передать данные из Layout.cshtml в частичное представление. По-видимому, это особенность, так как предполагается, что каждое представление имеет собственный объект ViewData. Кажется, ViewData не является глобальным, как я думал. Таким образом, то, что я получаю в ViewData ["MainView"] из Layout в моем частичном представлении, равно нулю ...... В конце концов я нашел способ обойти это и смог передать ссылку на страницу из Layout в Partialview через @Html. Вызов действия из Layout -> Controller -> PartialView. Мне удалось получить частичное представление для доступа и записи в правильном разделе визуализации. Однако я хочу вызывать одно и то же частичное представление много раз в моем Layout.cshtml. Последующий вызов того же самого Partialview снова в Layout не работает, так как ссылка на layout изменилась с момента первого вызова и обновления раздела render. Итак, код выглядит так:

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);
    }
0 голосов
/ 19 октября 2011

Сообщение об ошибке касается типа и типа возврата Книжной полки из модели.

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

        return myBooks;
    } 
...