2009-12-22 8 views
3

J'ai une vue unique qui a un menu sur le côté gauche et un conteneur sur le côté droit qui est rendu à partir de l'une de plusieurs vues partielles.Comment puis-je mieux gérer cette situation dans ASP.NET MVC concernant mes vues partielles?

En ce moment je suis en cours d'exécution dans une situation comme celle-ci vue "Index":

<div class="container"> 
    <div class="leftHandMenu"> 
     // various dynamic menu items 
    </div> 
    <div class="rightHandPane"> 
     <% if (Model.CurrentPane == "Sent") { %> 
      <% Html.RenderPartialView("SentPartial", Model.SomeData); %> 
     <% } else if (Model.CurrentPane == "Inbox") { %> 
      <% Html.RenderPartialView("InboxPartial", Model.SomeData); %> 
     <% } else if (Model.CurrentPane == "Alerts") { %> 
      <% Html.RenderPartialView("AlertsPartial", Model.SomeData); %> 
     <% } %> 
    </div> 
     // various other common view items 
</div> 

les actions suivantes:

public ActionResult Inbox(int? page) 
{ 
    MessageListViewModel viewData = new MessageListViewModel(); 
    viewData.SomeData = messageService.getInboxMessages(page.HasValue ? page.Value : 0); 
    viewData.CurrentPane = "Inbox"; 
    return View("Index", viewData); 
} 

public ActionResult Alerts(int? page) 
{ 
    MessageListViewModel viewData = new MessageListViewModel(); 
    viewData.SomeData = messageService.getAlertMessages(page.HasValue ? page.Value : 0); 
    viewData.CurrentPane = "Alerts"; 
    return View("Index", viewData); 
} 

public ActionResult Sent(int? page) 
{ 
    MessageListViewModel viewData = new MessageListViewModel(); 
    viewData.SomeData = messageService.getSentMessages(page.HasValue ? page.Value : 0); 
    viewData.CurrentPane = "Sent"; 
    return View("Index", viewData); 
} 

Je me rends compte de cette situation est pas idéale, mais J'ai besoin que ces portions restent des vues partielles. Je fais un tas d'appels ajax sur cette vue pour recharger ce "rightHandPane" avec les différentes vues partielles.

J'ai une seule vue "Index", puis ces différentes vues partielles qui chargent un volet particulier de "Index". Je passe le nom de la vue dans le ViewModel, puis je charge ces instructions if-else dans la vue partielle appropriée.

Comment pourrais-je faire cela? Je suis sur le point d'ajouter 3 vues partielles et cela commence à être pénible. Je préférerais ne pas avoir besoin de maintenir mon currentPane dans mon ViewModel.

Y at-il quelque chose que je peux faire pour éviter cette situation tous ensemble? J'ai envisagé d'utiliser une vue principale pour les parties communes, mais j'ai besoin d'une vue maître fortement typée, ce qui n'est pas si simple dans ASP.NET MVC.

Merci!

Répondre

2

Pourquoi ne pas utiliser des vues distinctes pour chaque action avec une page maître en prenant soin de tous les bits communs?

Vous pouvez avoir une page maître avec un espace réservé pour chaque section.

<div class="container"> 
    <div class="leftHandMenu"> 
     <asp:ContentPlaceHolder ID="LeftHandMenuContainer" runat="server" /> 
    </div> 
    <div class="rightHandPane"> 
     <asp:ContentPlaceHolder ID="RightHandPaneContainer" runat="server" /> 
    </div> 
     <asp:ContentPlaceHolder ID="FooterContainer" runat="server" /> 
</div> 

Ensuite, placez le contenu spécifique d'affichage dans chaque page de contenu.

+0

Eh bien, certains des bits communs sont dynamiques. J'aurais besoin d'une vue maître fortement typée. Je ne peux pas faire cela sans créer un contrôleur de base, non? – KingNestor

+0

La page maître peut avoir plusieurs espaces réservés de contenu différents dans lesquels vous pouvez placer votre contenu spécifique à la zone. .... Je vais ajouter à ma réponse. – Mark

+0

Le motif est connu sous le nom de composition de vue et constitue la manière correcte de résoudre ce problème. Factoriser les choses communes dans une mise en page et composer la vue à partir des partiels nécessaires en utilisant la mise en page pour définir la structure. – Neal

0

Vous pouvez soit

a) (si vous utilisez, ou allez utiliser, ASP.NET 4) ajouter un appel à Html.Action() ou Html.RenderAction() au lieu, et que l'action du contrôleur qui décide de rendre partielle. B) factoriser les instructions if à une méthode partielle partielle, ou à une méthode auxiliaire. Par exemple:

public static void RenderRightHandPane(this HtmlHelper helper, YourViewModelType model) 
{ 
    switch(model.CurrentPane.ToLower()) 
    { 
     case "sent": 
      helper.RenderPartialView("SentPartial", model.SomeData); 
     case "inbox": 
      helper.RenderPartialView("InboxPartial", model.SomeData); 
     case "alerts": 
      helper.RenderPartialView("AlertsPartial", Model.SomeData); 
     case default: 
      // Add a default handler - perhaps rendering a not found-view...? 
    } 
} 

qui est appelé comme ceci:

<% Html.RenderRightHandPane(Model); %> 
1

Vous pouvez simplement écrire:

Html.RenderPartialView(string.Format("{0}Partial", Model.CurrentPane), Model.SomeData); %> 

, mais je vous recommande de passer le nom de l'ensemble Vue partielle. Mon $ .02.

0

Vous pourriez "code par convention" et suivre ce modèle:

<div class="rightHandPane"> 
    <% Html.RenderPartialView(Model.CurrentPane + "Partial", Model.SomeData); %> 
</div>