2010-09-22 19 views
10

Czytałem posta Scotta Guthrie na Passing ViewData from Controllers to Views, ale nie sądzę, że lekcja jest kliknięciem dla mojej konkretnej sytuacji.Jak przekazać wiele modeli do widoków częściowych w ASP.NET MVC

(Uwaga: Ze względu na klientów własnych ograniczeń, nie mogę rozmawiać wklej rzeczywisty kod, więc przepraszam, jeśli mój składa się sprawa jest nieco głupie/dziwne).

Mam kontroler o nazwie ScenarioController który obsługuje różne działania związane z tworzeniem modelu scenariusza. Różne działania, które ukończy użytkownik, to ogólne CRUD scenariuszy. Mogę stworzyć stronę internetową, która zrobi to dla modelu Scenariusza. Niedawno zaktualizowałem model Scenariusz, aby teraz składał się z różnych podskładników (list innych obiektów). Odpowiedni widok wykorzystuje karty jQuery, które ładują widoki częściowe, aby ostatecznie załadować formularze do różnych danych podkomponentu. Niestety, tu mam problemy.

Moja strona Index aktualnie wygląda tak:

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

i częściowa strony są silnie wpisany do tego, co oni reprezentują (głównie List<SomeObject>).

W jaki sposób dane powinny być przechowywane w modelu scenariusza? Używam bazy danych SQL i współpracuję z Entity Framework. Czy nadal potrzebuję właściwości reprezentujących różne listy elementów (tak, że mogę przekazywać ViewData przy użyciu silnie typowanych klas), czy jest to coś, co mogę przekazać w ViewData bezpośrednio z wywołań encji (i odrzucić w razie potrzeby)?

Odpowiedz

4

Możesz przekazać dowolną liczbę modeli w swoim widoku. po prostu musisz stworzyć model obudowujący, który może zawierać wszystkie modele "do wysłania".

można również użyć ViewData, ale zalecane jest użycie modelu.

Czy Twoje 3 zakładki wymagają całego modelu lub tylko jego części?

Załóżmy, że masz 3 modele w swoim modelu enkapsulacji. nazwany tab1 tab2 tab3.

więc wtedy może wysłać każdy Renderpartial to odpowiedni model jak tak:

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

model hermetyzującego mógłby wtedy wyglądać

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

nadziei, że to pomoże

+0

To jest ścieżka raz pierwszy wziął. W przypadku Model.tab1, tab1 jest faktycznie EntityCollection, więc próbuję zrobić: Model.tab1.FirstOrDefault() (Nie potrzebuję teraz kolekcja). Otrzymuję komunikat o błędzie, który mówi: "Element modelu przekazany do słownika ma typ" Scenariusz ", ale ten słownik wymaga elementu modelu typu" Tab1 "." - Może robię głupi błąd? Dzięki, @Stefanvds! – JasCav

+0

po zrobieniu 1 (firstordault) nie masz listy, ale tylko 1 element typu Scenariusz. więc musisz zmienić Renderpartial na 1 Scenariusz, lub po prostu wykonaj FirstOrDefault wewnątrz RenderPartial – Stefanvds

+0

Tak ... Robię to. Oto mój częściowy widok: <% @ Control Language = "C#" Dziedziczy = "System.Web.Mvc.ViewUserControl "%> - Doceniam twoją pomoc ... jest to bardzo dziwny (i frustrujący) problem. – JasCav

Powiązane problemy