2011-10-08 10 views
5

Deseo generar sección de encabezado HTML en una acción secundaria; mientras que la página tiene muchas otras acciones infantiles. La sección de cabecera html depende de las otras acciones para determinar qué archivos js/css deben incluirse. Las diferentes acciones del niño podrían compartir el mismo archivo js/css; y las diferentes páginas tienen una combinación diferente de css/js, por lo que hay una razón para hacerlo. Aquí está mi código de muestra:Cómo cambiar las secuencias de acciones secundarias en MVC

Layout.cshtml: 
<html> 
<head> 
@RenderZone("header") 
</head> 
<body> 
@RenderZone("zone1") 
@RenderZone("zone2") 
@RenderZone("zone3") 
</html> 

Cada zona tiene 1 o muchas acciones secundarias.

El RenderZone es también una acción. El modo de datos:

Model = GetAllChildActions(zoneName) 

La vista RenderZone:

foreach(var m in Model) 
    @html.action(controller = m.controller, action = m.action) 

Debido a que la zona de cabecera es la parte superior por lo que siempre se ejecuta en primer lugar, entonces no puede obtener datos de otras acciones del niño. He intentado con los filtros (onActionExecuted; onActionResultExcuted, etc.) pero ninguno de ellos funciona. Realmente necesito ejecutar la acción del encabezado después de que se procesen todas las acciones secundarias. No quiero generar el CSS en la parte inferior de una página. Podría, pero no quiero usar javascript para inyectar los archivos js/css; o escribe un módulo http para "manualmente" cambiar el html de salida. Es muy fácil de manejar en forma de web. Creo que hay una manera de hacerlo en MVC también. ¡Cualquier ayuda será apreciada!

+0

¿No es posible un 'OrderBy()' simple? –

+0

¡Gracias por tu respuesta! pero no hay ningún tipo disponible para acciones (acciones secundarias) en una página. A diferencia de Webform, que podemos cargar el control del usuario al encontrar una identificación de control, la maquinilla de afeitar MVC no proporciona una forma de verificar los elementos secundarios de una página. – user985287

Respuesta

3

Usted puede pre-procesamiento de todas las acciones del niño:

@{ 
    var prerender = new Dictionary<string, MvcHtmlString>(); 
    prerender["header"] = RenderZone("header"); 
    prerender["zone1"] = RenderZone("zone1"); 
} 

Y luego en el cuerpo:

@prerender["header"] 

De esta manera usted puede tener todos los niños realizan su ejecución antes de rendir el primera zona en su vista y almacenar los registros de script/css en el HttpContext actual.

+1

Sí, funciona Mr. Pre-render !! ¡No puedo creer que sea una solución tan simple! En realidad, tiene otro beneficio que puedo representar las acciones al hacer un bucle de los nombres de las zonas de la base de datos. ¡Ahora puedo controlar totalmente el orden de la representación de zonas en función de mi configuración! Por cierto, los datos no se pueden poner en la carpeta de visualización/datos del padre. No se por que. En el controlador base, agregué un método de prueba para poner datos anulando OnAction/Result Execution/ed pero no funcionó. Puse mis datos en HttpContext.Items y funciona muy bien. ¡Gracias de nuevo, tanto! y gracias ¡Visto por abrir una recompensa! – user985287

+0

Es bueno saber sobre Parent ViewBag, sospeché pero pensé que podría ser posible. HttpContext es igual de bueno, buena llamada. –

+0

Modifiqué la respuesta para eliminar la referencia a ParentActionContext ViewBag y decir que use HttpContext –

Cuestiones relacionadas