2010-09-22 19 views
10

He estado leyendo la publicación de Scott Guthrie en Passing ViewData from Controllers to Views, pero no creo que la lección haga clic para mi situación específica.¿Cómo paso múltiples modelos a vistas parciales en ASP.NET MVC

(Nota: Debido a las restricciones de propiedad del cliente, no puedo hablar pegar el código real, por lo que me disculpo si mi componían caso es un poco estúpida/confuso.)

Tengo un controlador llamado ScenarioController cuales maneja las diversas acciones que giran en torno a la creación de un modelo de escenario. Varias acciones que completará un usuario son el CRUD general de Escenarios. Puedo crear un sitio web que hace esto para el modelo de escenario. Sin embargo, recientemente actualicé el modelo de Escenario para que ahora esté compuesto de varios subcomponentes (listas de otros objetos). La vista correspondiente utiliza jQuery Tabs que carga vistas parciales para, en última instancia, cargar los formularios en los diversos datos de subcomponentes. Desafortunadamente, aquí es donde estoy teniendo problemas.

Mi página Índice actualmente se ve algo como esto:

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

Y las páginas parciales son de tipo fuerte de lo que representan (principalmente List<SomeObject>).

¿Cómo deben almacenarse los datos dentro del modelo de escenario? Estoy usando una base de datos SQL e interactuando con Entity Framework. ¿Todavía necesito propiedades que representen las diversas listas de elementos (para poder pasar ViewData usando clases muy tipadas), o es algo que puedo pasar en ViewData directamente desde las llamadas a la entidad (y enviarlas según sea necesario)?

Respuesta

4

Puede pasar tantos modelos como desee en su vista. solo tiene que hacer un modelo de encapsulado que pueda contener todos sus modelos 'para enviar'.

También puede hacer uso de ViewData, pero se recomienda el uso de un modelo.

¿Sus 3 pestañas necesitan todo el modelo o solo una parte?

digamos que tiene 3 modelos en su modelo de encapsulado. llamada tab1 tab2 tab3.

es así, usted podría enviar a cada Renderpartial es modelo apropiado como tan:

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

su modelo de encapsulación podría tener el siguiente aspecto

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

esperanza esto ayuda

+0

Este es el camino que primero tomó. En el caso de Model.tab1, tab1 es en realidad una EntityCollection, así que estoy tratando de hacer: Model.tab1.FirstOrDefault() (no necesito la colección en este momento). Aparece un mensaje de error que dice: "El elemento del modelo pasado al diccionario es de tipo 'Escenario', pero este diccionario requiere un elemento de modelo del tipo 'Tab1'." - Tal vez estoy haciendo un error tonto? Gracias, @Stefanvds! – JasCav

+0

cuando toma 1 (firstordefault) no tiene una lista sino solo 1 artículo del tipo Escenario. entonces necesitas cambiar tu RenderPartial para tomar 1 Escenario, o simplemente haces FirstOrDefault dentro de RenderPartial – Stefanvds

+0

Sí ... Lo estoy haciendo. Aquí está mi vista parcial: <% @ Control Language = "C#" Hereda = "System.Web.Mvc.ViewUserControl "%> - Agradezco su ayuda ... este es un problema muy extraño (y frustrante). – JasCav

Cuestiones relacionadas