2011-05-06 7 views
4

Je travaille sur un MVC3/page Razor, et dans mon _layout jeMVC3 - RenderPartial intérieur RenderSection ne fonctionne pas

@RenderSection("relatedBooksContainer", false) 

Dans une autre page j'utiliser cette section avec:

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

Cela ne fonctionne pas. D'après ce que j'ai lu, RenderSection ne sera jamais qu'un seul niveau de profondeur - il n'a pas de concept de Html.RenderPartial dans la section correspondante et retournera simplement une zone vide. La solution de contournement que j'ai lue à http://forums.asp.net/t/1590688.aspx/2/10 est d'utiliser RenderPage et de valider le code HTML renvoyé à une chaîne, puis outout cette chaîne dans la section de rendu ... qui fonctionne! C'est, jusqu'à ce que je passe un modèle à la page partielle, il renvoie une erreur en disant:

L'élément de modèle passé dans le dictionnaire est de type « TheBookshelf.ViewModels.BookshelfViewModel », mais ce dictionnaire nécessite un modèle élément de type 'System.Collections.Generic.List`1 [countsshelf.EntityModel.Book]'.

Quelqu'un at-il une idée de ce qui pourrait se passer? Existe-t-il d'autres moyens d'y parvenir?

+0

Donc "@section relatedBooksContainer" est dans une partie? –

+0

Il semble que vous ayez besoin d'utiliser des dispositions imbriquées ... –

+0

"So" @section relatedBooksContainer "est dans une partie?" ---- Cette section du code est dans sa propre page autonome, mais le "~/Views/Shared/Bookshelf.cshtml" est une page partielle, que la page normale appelle. Cela semble casser dans MVC.De plus, je ne peux pas le mettre dans le fichier _Layout car chaque page qui implémente le "@section relatedBooksContainer" passe dans son propre modèle, donc avoir un appel à la page partielle sans aucun modèle ne fonctionnera pas non plus. – boolean

Répondre

0

Le message d'erreur concerne le type et le type de retour du Bookshelf du modèle.

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

     return myBooks; 
    } 
0

La solution du lien fourni a-t-elle fonctionné pour vous?

Je ne pouvais pas le faire fonctionner. C'est pourquoi je n'ai pas pu obtenir ViewData ["MainView"] pour passer les données de Layout.cshtml à partialview. Ceci est une fonctionnalité car chaque vue est censée avoir son propre objet ViewData. Il semble que ViewData n'est pas global comme je l'ai pensé. Donc ce que je reçois dans ViewData ["MainView"] de Layout dans ma vue partielle est nul ...... J'ai finalement trouvé un travail pour cela et j'ai pu passer la référence de page de Layout à Partialview via un @Html. Appel d'action à partir de Layout -> Controller -> PartialView. J'ai pu obtenir ma vue partielle pour accéder et écrire à la bonne résolution. Cependant, je veux appeler la même vue partielle plusieurs fois dans mon Layout.cshtml. Un appel ultérieur à la même vue partielle dans la mise en page ne fonctionne pas, car la référence à la mise en page a changé depuis la première mise à jour de l'appel et du rendu. Ainsi, le code ressemble à ceci:

Layout.cshtml:

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

Vue partielle:

@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>"); }); 
    } 

} 

} 
contrôleur

:

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

Essayez le @ Html.Partial place

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