2010-09-22 5 views
10

Ho letto il post di Scott Guthrie su Passing ViewData from Controllers to Views, ma non penso che la lezione stia cliccando per la mia situazione specifica.Come si passano più modelli a viste parziali in ASP.NET MVC

(Nota: a causa di client restrizioni proprietarie, non posso parlare incollare il codice vero e proprio, quindi mi scuso se il mio caso è costituito da un po 'stupido/confusa.)

Ho un controller chiamato ScenarioController che gestisce le varie azioni che ruotano attorno alla creazione di un modello Scenario. Varie azioni che un utente completerà sono il CRUD generale degli scenari. Posso creare un sito Web che faccia questo per il modello Scenario. Tuttavia, di recente ho aggiornato il modello Scenario in modo che ora sia composto da vari sottocomponenti (elenchi di altri oggetti). La vista corrispondente utilizza le schede jQuery che caricano le viste parziali e, in definitiva, caricano i moduli sui vari dati del sottocomponente. Sfortunatamente, è qui che sto avendo problemi.

La mia pagina Indice attualmente simile a questa:

<%@ 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> 

E le pagine parziali sono strongly-typed per ciò che rappresentano (in primo luogo List<SomeObject>).

Come devono essere memorizzati i dati nel modello Scenario? Sto usando un database SQL e interfacciato con Entity Framework. Ho ancora bisogno di proprietà che rappresentano i vari elenchi di elementi (quindi posso passare ViewData usando classi fortemente tipizzate), o è qualcosa che posso passare nel ViewData direttamente dalle chiamate di entità (e trasmettere come necessario)?

risposta

4

È possibile passare il numero di modelli che si desidera nella visualizzazione. devi solo creare un modello incapsulante che possa contenere tutti i tuoi modelli "da inviare".

è inoltre possibile utilizzare ViewData ma si consiglia l'utilizzo di un modello.

Le 3 schede richiedono l'intero modello o solo una parte di esso?

diciamo che hai 3 modelli nel tuo modello di incapsulamento. denominato tab1 tab2 tab3.

così allora si potrebbe inviare ogni Renderpartial è modello appropriato come così:

 <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> 

vostro modello incapsulante potrebbe quindi apparire come

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; } 
    } 
} 

speranza che questo aiuta

+0

Questo è il percorso che ho prima ha preso. Nel caso di Model.tab1, tab1 è in realtà un EntityCollection, quindi sto cercando di fare: Model.tab1.FirstOrDefault() (Non ho bisogno della raccolta in questo momento). Viene visualizzato un messaggio di errore che dice: "L'elemento del modello passato nel dizionario è di tipo 'Scenario', ma questo dizionario richiede un elemento del modello di tipo 'Tab1'." - Forse sto facendo un errore stupido? Grazie, @Stefanvds! – JasCav

+0

quando prendi 1 (firstordefault) non hai una lista ma solo 1 elemento del tipo Scenario. quindi è necessario modificare RenderPartial per prendere 1 Scenario, oppure basta fare il FirstOrDefault all'interno della RenderPartial – Stefanvds

+0

Sì ... Lo sto facendo. Ecco la mia vista parziale: <% @ Control Language = "C#" Inherits = "System.Web.Mvc.ViewUserControl "%> - Apprezzo il tuo aiuto ... questo è un problema molto strano (e frustrante). – JasCav