2009-01-08 18 views
8

Estoy trabajando en un proyecto ASP.NET MVC donde estoy usando enrutamiento para producir URL amigables y tengo un problema que no estoy seguro de cuál es la mejor solución.ASP.NET MVC: ¿Es una mala idea devolver diferentes vistas desde una sola acción del controlador?

El enrutamiento tengo trabajo de configuración como la siguiente

{categoría}

{categoría}/{fabricante}

{categoría}/{fabricante}/{producto}

El problema que tengo es que quiero mostrar las coincidencias en la misma ruta de diferentes maneras. p.ej.

Muestra Category1

  • una descripción seguido por
  • Una Imagen seguido de un
  • Lista de los productos

Categoría2 Muestra

  • una imagen seguida de
  • Promociones seguido de un
  • Descripción

que han regresado esto por tener un ViewTemplate enumeración asociada con la categoría y luego volver la vista con el mismo nombre, pero esto no se siente bien, en primer lugar porque No estoy seguro de que deba ser así de lógica en la acción del controlador y también sigo haciendo las mismas llamadas a bases de datos, lo cual está bien para algunas cosas, pero si una categoría tiene 500 productos, todavía los estoy sacando de la base de datos incluso para la Categoría2 cuando no serán usados. Ahora al grano:

  1. ¿Es incorrecto devolver diferentes vistas de la misma acción del controlador?
  2. ¿Cómo se ocuparía de cargar datos diferentes para cada vista?
  3. Si estoy equivocado (lo cual creo que soy) ¿Cómo debería estar haciendo algo como esto?

Gracias por cualquier ayuda que pueda.

Respuesta

8

No soy un gurú aquí, pero en otros marcos MVC, he hecho (y he visto) cosas similares. El trabajo del Controlador es determinar qué Vista se devuelve en función de quién pregunta, qué se pregunta, etc. La forma en que determina el Nombre de la vista es realmente una cuestión de lo que es mejor para su aplicación y/o su modificabilidad/comprobabilidad.

5

en MVC es responsabilidad del controlador decidir qué vista devolver, por lo que es perfectamente normal tener un controlador que devuelva varias vistas diferentes. Los controladores deben ser relativamente simples. Deben tomar una instrucción del cliente. Acceda al modelo para iniciar cualquier cambio que necesite realizar. Obtenga algunos datos del modelo. Y use esta información para decidir qué vista mostrarle al cliente.

En su situación creo que lo apropiado para el controlador que hacer es lo siguiente:

  1. obtener alguna información general sobre el producto.
  2. Utilice esta información general para decidir qué vista usar.
  3. Obtenga los datos para esa vista en particular.
  4. Devuelve la vista.

Creo que si le preocupa que lo esté haciendo mal, debe asegurarse de que el modelo solo contenga métodos que tengan sentido en el contexto del dominio. No deberían estar estrechamente vinculados con una vista particular. por ejemplo Product.GetDataForMiniProductView (int id) es incorrecto, esto debería ser la lógica del controlador. por otro lado, Product.GetStockCount definitivamente debe estar en el modelo y no en el controlador.

Cuestiones relacionadas