2010-09-22 4 views
10

J'ai lu le message de Scott Guthrie sur Passing ViewData from Controllers to Views, mais je ne pense pas que la leçon clique pour ma situation spécifique.Comment passer plusieurs modèles à des vues partielles dans ASP.NET MVC

(Note: En raison de restrictions de propriété des clients, je ne peux pas parler coller le code réel, donc je suis désolé si mon composée cas est un peu stupide/confus.)

J'ai un contrôleur appelé ScenarioController qui gère les différentes actions qui tournent autour de la création d'un modèle de scénario. Les diverses actions qu'un utilisateur va compléter sont les CRUD générales des scénarios. Je peux créer un site Web qui fait cela pour le modèle Scénario. Cependant, j'ai récemment mis à jour le modèle Scénario afin qu'il soit maintenant composé de divers sous-composants (listes d'autres objets). La vue correspondante utilise des onglets jQuery qui chargent des vues partielles pour charger les formulaires dans les différentes données de sous-composants. Malheureusement, c'est là que j'ai des problèmes.

Ma page d'index ressemble actuellement quelque chose comme ceci:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 

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

<% using (Html.BeginForm()) {%> 
    <div id="scenario"> 
     <div id="tabs"> 
      <ul> 
       <li><a href="#tab1">Tab 1</a></li> 
       <li><a href="#tab2">Tab 2</a></li> 
       <li><a href="#tab3">Tab 3</a></li> 
      </ul> 

      <div id="tab1"><% Html.RenderPartial("Tab1"); %></div> 
      <div id="tab2"><% Html.RenderPartial("Tab2"); %></div> 
      <div id="tab3"><% Html.RenderPartial("Tab3"); %></div> 
     </div> 

     <div class="submitButtons"> 
      <input type="button" value="Save Scenario" id="SaveScenario" /> 
      <input type="button" value="Submit Scenario" id="SubmitScenario" /> 
     </div> 
    </div> 
<% } %> 
</asp:Content> 

Et les pages partielles sont fortement typé à ce qu'ils représentent (principalement List<SomeObject>).

Comment les données doivent-elles être stockées dans le modèle de scénario? J'utilise une base de données SQL et l'interfaçage avec Entity Framework. Ai-je besoin de propriétés représentant les différentes listes d'éléments (pour que je puisse passer ViewData en utilisant des classes fortement typées), ou est-ce quelque chose que je peux passer directement dans ViewData à partir des appels d'entités?

Répondre

4

Vous pouvez transmettre autant de modèles que vous le souhaitez. il suffit de faire un modèle encapsulant qui peut contenir tous vos modèles 'envoyer'.

Vous pouvez également utiliser ViewData mais l'utilisation d'un modèle est recommandée.

Vos 3 onglets ont-ils besoin du modèle entier ou seulement d'une partie de celui-ci? Disons que vous avez 3 modèles dans votre modèle d'encapsulation. nommé tab1 tab2 tab3.

alors vous pouvez envoyer chaque Renderpartial il est le modèle approprié comme si:

 <div id="tab1"><% Html.RenderPartial("Tab1", Model.tab1); %></div> 
     <div id="tab2"><% Html.RenderPartial("Tab2", Model.tab2); %></div> 
     <div id="tab3"><% Html.RenderPartial("Tab3", Model.tab3); %></div> 

votre modèle d'encapsulage pourrait alors ressembler à

namespace MVCNAMESPACE.Models { 
    public partial class EnCapModel { 
     public List<SomeObject> tab1 { get; set; } 
     public List<SomeObject> tab2 { get; set; } 
     public List<SomeObject> tab3 { get; set; } 
    } 
} 

espérons que cette aide

+0

Ceci est le chemin que je premier a pris. Dans le cas de Model.tab1, tab1 est en fait un EntityCollection, donc j'essaye de faire: Model.tab1.FirstOrDefault() (je n'ai pas besoin de la collection pour l'instant). Je reçois un message d'erreur qui dit: "L'élément de modèle passé dans le dictionnaire est de type" Scénario ", mais ce dictionnaire nécessite un élément de modèle de type" Tab1 "." - Peut-être que je fais juste une erreur stupide? Merci, @Stefanvds! – JasCav

+0

lorsque vous prenez 1 (firstordefault) vous n'avez pas de liste mais seulement 1 élément du type Scenario. donc vous devez changer votre RenderPartial pour prendre 1 Scénario, ou vous faites juste le FirstOrDefault dans le RenderPartial – Stefanvds

+0

Ouais ... Je fais ça. Voici ma vue partielle: <% @ Control Language = "C#" Inherits = "System.Web.Mvc.ViewUserControl "%> - J'apprécie votre aide ... c'est un problème très étrange (et frustrant). – JasCav

Questions connexes