2010-04-02 13 views
5

Acabo de terminar mi primer ASP.NET MVC (2) CMS. El siguiente paso es crear un sitio web que muestre los datos de la base de datos de CMS. Este es el diseño de página web:asp.net mvc2 - controlador para la página maestra y la organización de código

http://img56.imageshack.us/img56/4676/portal.gif http://img56.imageshack.us/img56/4676/portal.gif


# 1 (cuadro rojo) - Categorías de pantallas del artículo. ViewModel:

public class CategoriesDisplay 
    { 
     public CategoriesDisplay() { } 

     public int CategoryID { set; get; } 
     public string CategoryTitle { set; get; } 
    } 

# 2 (cuadro Brown) - pantallas últimos artículos X; salta los del recuadro verde n. ° 3. Viewmodel:

public class ArticleDisplay 
    { 
     public ArticleDisplay() { } 

     public int CategoryID { set; get; } 
     public string CategoryTitle { set; get; } 

     public int ArticleID { set; get; } 

     public string ArticleTitle { set; get; } 
     public string URLArticleTitle { set; get; } 
     public DateTime ArticleDate; 

     public string ArticleContent { set; get; } 

    } 

# 3 (caja verde) - Muestra los últimos x artículos. Utiliza el mismo modelo de vista como cuadro marrón # 2

# 4 (caja azul) - Muestra la lista de los próximos eventos. Usa dataContext.Model.Event como ViewModel

Las casillas # 1, # 2 y # 4 se repetirán en todo el sitio y son parte de la Página maestra. Entonces, mi pregunta es: ¿cuál es la mejor manera de transferir estos datos de Modelo a Controlador y finalmente a Ver páginas?

  1. ¿Debo hacer un controlador para la página maestro y la clase ViewModel que envolverá todas estas clases juntos o
  2. Debería crear vistas parciales para cada una de estas cajas y hacer que cada de ellos heredan clase apropiada (si es posible incluso que funciona de esta manera?) O
  3. ¿Debo poner este código repetido en todos los controladores y todos adicional de transferencia de datos a través de ViewData, que sería probablemente el WOR se way :) O
  4. Existe tal vez una forma mejor y más simple pero no lo sé/lo veo?


Gracias de antemano, Ile



EDIT:
Si su respuesta es No. 1, a continuación, por favor explique cómo hacer un controlador para la página principal!

EDIT 2:
En este tutorial se describe cómo pasar datos a la página principal utilizando clase abstracta: http://www.asp.net/LEARN/mvc/tutorial-13-cs.aspx
En "Listado 5 - Controladores \ MoviesController.cs", se recuperan los datos directamente de la base de datos utilizando LINQ, no del repositorio. Entonces, me pregunto si esto es solo en este tutorial, o si hay algún truco aquí y el repositorio no puede/no debería ser usado.

+0

¿Es posible crear una página maestra fuertemente tipada en MVC? –

+0

También me gustaría saber la respuesta a esta pregunta –

+0

la respuesta para pasar datos a la Página Maestra está aquí: http://www.asp.net/LEARN/mvc/tutorial-13-cs.aspx –

Respuesta

4

para obtener los datos a mi página maestra:

  • no me gusta usar una clase abstracta para obtener los datos a la página maestra. Prefiero la composición sobre la herencia.
  • No me gusta usar el diccionario ViewData porque no está muy tipado.

Crearía Vistas, Modelos de Vista y Acciones para cada sección. Luego llame al Html.RenderAction(...) Por ejemplo:

Crearía CategoriesDisplay.aspx con solo el html para el redbox. Me gustaría pasar que su modelo CategoriesDisplay. Luego, en mi regulador:

public class CategoryController : Controller 
{ 
    public ActionResult DisplayCategories() 
    { 
     var model = new CategoriesDisplay(); 
     ... 
     return View(model); 
    } 
} 

entonces en mi página maestra:

<% Html.RenderAction<CategoryController>(c => c.DisplayCategoreis()); %> 

Esto hará que la vista CategoriesDisplay en línea dentro de la página maestra. Que a su vez le permite tener SOC (Seperation of Concerns), código limpio y manejable.

+0

Probablemente debería agregar, la extensión Html.RenderAction que utilicé es parte del Asp.Net MVC Futures Assembly. http://aspnet.codeplex.com/releases/view/41742 – mxmissile

+0

Ya veo ... no sabía qué era este Html.RenderAction así que era un poco escéptico. Esto definitivamente suena como una solución más interesante que la que tiene la clase abstracta. Lo probaré en un día o dos y veré si realmente me funciona :) Gracias maxmissile! –

+0

¿Es posible hacer una acción de controlador y usarla en diferentes vistas? Para ser más precisos, ¿es posible definir dentro de Html.RenderAction() qué Controlador, qué Acción y qué Vista usar? –

2

Luché con esto también.Inicialmente, descargué un montón de datos adicionales en ViewData, que acabó teniendo que ser devuelto (hice algunas extensiones que facilitaron esto, pero aún no es genial).

Iría con su opción n. ° 1 y crearía un ViewModel que englobaría todas las clases que necesitaría.

+0

Edito mi pregunta ... Olvidé agregar que no tengo idea de cómo hacer el controlador para la página maestra (soy un novato de asp.net) –

Cuestiones relacionadas