2008-10-26 18 views
6

Creo que sé la respuesta, pero me gustaría rebatir algunas ideas.¿Cómo paso varios objetos a ViewPage en ASP.NET MVC?

Me gustaría pasar varios (en este caso 2) datos algo diferentes a una Vista. Mi pensamiento inicial es simplemente resumir los diversos objetos en un objeto que los contiene y pasarlos por ese camino. Luego de la vista, tendría algo así como

var objContainer = ViewData.Model; 
var thisObject = objContainer.ThisObject; 
var thatObject = objContainer.ThatObject; 

y éstas podrían ser utilizadas de forma independiente en la página maestra y la vista de página.

¿Es esa la "mejor" manera?

Respuesta

11

Me resulta útil crear clases adicionales dedicadas que se presentarán a las Vistas. Los guardo en un espacio de nombre separado llamado 'Core.Presentation' para mantener las cosas organizadas. Aquí está un ejemplo:

namespace Core.Presentation 
{ 
    public class SearchPresentation 
    { 
     public IList<StateProvince> StateProvinces { get; set; } 
     public IList<Country> Countries { get; set; } 
     public IList<Gender> Genders { get; set; } 
     public IList<AgeRange> AgeRanges { get; set; } 
    } 
} 

Entonces me aseguro de que mi punto de vista es una vista inflexible de tipos que utiliza la versión genérica de esa clase de presentación:

public partial class Search : ViewPage<SearchPresentation> 

De esa manera en la vista, puedo usar Intellisense y navegue fácilmente por los artículos.

1

Tengo la misma situación pasando. Aquí está mi solución (puede que no sea la mejor práctica, pero funciona para mí).

creé una serie de clases "Agrupar":

public class Duo<TFirst,TSecond> { /*...*/ } 
public class Trio<TFirst,TSecond, TThird> { /*...*/ } 

y un objeto de fábrica para crearlos (para tomar ventaja de la inferencia de tipos ... algunos de los TFirsts y TSeconds y TThirds puede ser largo)

public static class Group{ 

public static Duo<TFirst, TSecond> Duo(TFirst first, TSecond second) { 
    return new Duo<TFirst, TSecond>(first, second); 
}  
/*...*/ 
} 

Me da seguridad de tipo y intellisense con un mínimo de alboroto. Simplemente huele porque estás agrupando clases que esencialmente no tienen una relación real entre ellas en un solo objeto. Supongo que podría ser mejor extender la clase ViewPage para agregar un segundo y tercer ViewModel, pero la forma en que lo hice requiere mucho menos trabajo.

1

Sí, la clase que especifique como modelo puede estar compuesta por otras clases. Sin embargo, ¿por qué no usar el diccionario, así:

ViewData["foo"] = myFoo; 
ViewData["bar"] = myBar; 

creo que esto es preferible a la definición del modelo como un contenedor para objetos no relacionadas, que para mí tiene un olor raro.

+1

El mayor problema con esto es que pierdes inteligencia y seguridad. Además, ahora tiene una dependencia adicional entre la vista y el modelo (que el compilador no puede aplicar) ya que ambos deben saber y entender qué significa "foo" y "barra" ... – Will

Cuestiones relacionadas