2008-12-03 7 views
10

Estoy trabajando en una aplicación ASP.NET MVC que contiene un encabezado y un menú en cada página. El menú y el encabezado son dinámicos. En otras palabras, los elementos del menú y la información del encabezado se determinan en tiempo de ejecución.Uso de un controlador base para obtener Common ViewData

Mi primer pensamiento es construir un controlador base del que se deriven todos los demás controladores. En el controlador base, obtendré el menú y los datos del encabezado e insertaré la información requerida en ViewData. Finalmente, usaré ViewUserControl para mostrar el encabezado y el menú a través de una plantilla de página maestra.

Por lo tanto, estoy tratando de determinar la mejor práctica para desarrollar dicha funcionalidad. Además, si este es el enfoque recomendado, ¿qué método debo anular (supongo que Ejecutar) al obtener los datos para insertarlos en ViewData?

Estoy seguro de que este es un escenario común, por lo que cualquier consejo/mejores prácticas sería apreciado! ¡Gracias por adelantado!

EDIT: Encontré los siguientes recursos después de publicar esto (por supuesto), ¡pero cualquier anécdota adicional sería increíble!

http://www.singingeels.com/Blogs/Nullable/2008/08/14/How_to_Handle_Side_Content_in_ASPNET_MVC.aspx

How do you use usercontrols in asp.net mvc that display an "island" of data?

Respuesta

2

Depende de dónde proviene su información. Tenemos datos de vista estándar que usamos para generar parte de la información que tenemos en la pantalla que creamos de esta manera. Funciona bien y se mantiene fácilmente. We override the View method to implement strongly typed view names y use esta información para recuperar algunos de los datos que la página maestra requiere también.

+0

Esa es una técnica bastante impresionante. +1 Bazillion – jfar

0

voy a responder a su pregunta con otra pregunta. ¿El controlador base tendrá que determinar qué tipo es realmente para generar los datos de menú adecuados? Si es así, estás derrotando el propósito del polimorfismo y el código para generar los datos debe ir en cada controlador, tal vez en OnActionExecuting si el menú es el mismo para todas las acciones. Volver a meterlo en una clase para padres probablemente termine con una declaración de cambio en la clase principal haciendo lo que cada controlador derivado realmente debería cuidar.

+0

Los datos del menú son los mismos en todas las páginas pero diferentes para cada usuario único. –

1

Puede escribir una extensión auxiliar para representar el encabezado/menú De esta forma puede hacer que se muestre en diferentes lugares de la vista en caso de necesidad, pero solo en un lugar para el mantenimiento.

public static HtmlString MainMenu(this HtmlHelper helper) 
1

Utilice una clase de controlador base para implementar los métodos de filtro generell. La clase de controlador implementa algunas interfaces de filtro IActionFilter, IAuthorizationFilter, IExceptionFilter e IResultFilter, que son útiles para implementar un comportamiento común para todos los controladores.

Si los datos del menú son los mismos en todas las páginas pero diferentes para cada usuario único.
Genere la menudata en un método OnAuthorization o Initialize de la clase base de su controlador. Primero se llamará a la autorización. Initialize se llamará antes de cada método de acción. Usted tiene acceso al contexto ViewData. Genera la menudata allí. Ponga el contenido de la vista para el menú y el encabezado en la página maestra y acceda a ViewData generado allí.

1

Hace un par de meses abordé un desafío de diseño similar: implementar una característica de ruta de navegación que cambia a medida que el usuario navega de una página a otra.

Anulé el método OnActionExecuting para juntar las migas de pan y almacenarlas en ViewData (utilizo el nombre de la acción como breadCrumb de la vista). Luego actualicé la página maestra para incluir un control de usuario que toma el ViewData y procesa las migas de pan.

Una cosa a tener en cuenta es que si estuviera usando el valor por defecto del atributo manejo [HandleError] error de ASP.NET MVC y su página de error está utilizando la misma página maestra que intenta leer el ViewData, pronto descubrirá que pueda 't acceder ViewData desde su página de error y se generará una excepción. Dependiendo de si necesita el ViewData para escenarios de falla, la solución viable es usar una página maestra separada o hacer esto: How do I pass ViewData to a HandleError View?

Cuestiones relacionadas