8

Voici un scénario: Disons que j'ai un site avec deux contrôleurs chargés d'afficher différents types de contenu - Pages et articles. J'ai besoin d'intégrer une vue partielle dans ma page maître qui liste les pages et articles filtrés avec certains critères, et s'affiche sur chaque page. Je ne peux pas définir Model sur ma page de master (ai-je raison?). Comment résoudre cette tâche en utilisant Html.RenderPartial? Oui, je créerais probablement des vues partielles séparées pour la liste des articles et des pages, mais il y a quand même une barrière que je ne peux pas et ne devrais pas définir le modèle sur masterpage. J'ai besoin de dire d'une façon ou d'une autre "voici les pages" comme argument de mon rendupartial, et aussi pour des articles. Tout le concept de renderpartial avec les données de la base de données dans les pages principales est un peu flou pour moi.Html.RenderPartial appel de masterpage

Répondre

0

La propriété ViewData Model ne doit être utilisée que pour le contenu que vous consultez/modifiez dans la section principale de l'interface utilisateur.

D'autres parties de la vue peuvent nécessiter des données dans ViewData, il suffit donc de les ajouter au dictionnaire.

Je passerais juste des données du dictionnaire comme ceci: ViewData ["articles"] au partiel. (ou ViewData.Get() de MvcContrib).

Vous pouvez également consulter le modèle SubController récemment implémenté dans MvcContrib.

0

oui, c'est correct. mais regardons ce scénario: sur les vues qui sont liées aux articles, j'aurais ViewData ["article"], et sur les vues liées aux pages, j'ai ViewData ["pages"], mais je n'ai pas les deux articles et pages disponibles tout le temps. Donc, si j'ajoute:

Html.RenderPartial ("articlesView", vidéotex [ "articles"])

Html.RenderPartial ("pagesView", vidéotex [ "pages"])

à mon masterpage, une exception sera levée sur chaque page sur laquelle ViewDataDictionary ne contient pas à la fois des articles et des pages.

Au moins, c'est comme ça que je le vois.

1

J'ai eu un similar post et est venu avec un modèle d'objet pour le manipuler. Je déteste les vues non fortement typées donc je suis allé avec cette approche et cela fonctionne bien.

2

Que diriez-vous de créer une méthode d'extension HtmlHelper qui vous permet d'appeler un résultat de vue partielle sur une action sur le contrôleur.

Quelque chose comme

public static void RenderPartialAction<TController>(this HtmlHelper helper, Func<TController, PartialViewResult> actionToRender) 
    where TController : Controller, new() 
{ 
    var arg = new TController {ControllerContext = helper.ViewContext.Controller.ControllerContext}; 
    actionToRender(arg).ExecuteResult(arg.ControllerContext); 
} 

vous pouvez ensuite utiliser dans votre page maître comme

<% Html.RenderPartialAction((HomeController x) => x.RenderPartial()) %> 

et dans votre contrôleur la méthode appropriée

public PartialViewResult RenderPartial() 
{ 

    return PartialView("~/Path/or/View",_homeService.GetModel()) 
} 

Eh bien, ce sont mes 2 cents de toute façon

0

La façon dont je gère cela est en utilisant un BaseViewModel. Toutes les vues sont fortement typées par rapport à un modèle de vue qui hérite de BaseViewModel.

La classe BaseViewModel contient toutes les informations requises par MasterPage. Donc, pour la navigation de vos BaseViewModel peuvent ressembler à ceci:

public class BaseViewModel 
{ 
    public BaseViewModel() 
    { 
     NavigationItems = RetrieveNavigationItemsFromModel(); 
    } 
    public List<NavItems> NavigationItems {get; set;} 
} 

Dans votre MasterPage et PartialViews, vous pouvez lancer le modèle à BaseViewModel et accéder à la propriété NavigationsItems.

<ul> 
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %> 
    <li> 
     <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a> 
    </li> 
<% } %> 
</ul> 
0

Ceci est une réponse très tardive , mais je suis arrivé à cette page en googlant - donc il y a des chances que quelqu'un d'autre verra cette question (et ma réponse) aussi.

La façon dont j'ai travaillé autour de ce problème consiste à utiliser un simple script jQuery pour charger une vue partielle et exécuter son code de contrôleur. Échantillon ci-dessous.

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 

    <script type="text/javascript"> 
      $(document).ready(function() { 
      $("#applicationForm").load("/Home/ApplicationForm"); 
      }); 
    </script> 

    <div id="applicationForm" /> 

</asp:Content> 

Le grand inconvénient de cette approche est que le client doit utiliser le script activé pour que cela fonctionne (il est donc vraiment SEO hostile). Si c'est quelque chose que vous pouvez vivre avec ça fonctionne bien. Je ne l'utilise que sur un site intranet où je sais que chaque client a JavaScript activé et je n'ai pas à me soucier des bots de google.

Questions connexes