2012-02-15 9 views
8

Cuando ASP.NET MVC ejecuta una página que contiene Razor, primero ejecutará el cuerpo, por ejemplo, el método RenderBody, luego ejecutará el código para el diseño y lo entrelazará.¿Hay anzuelos en ASP.NET MVC antes de la ejecución del diseño y procesamiento de cuerpo posterior?

Esto se documenta en este blog post:

System.Web.Mvc.RazorView.RenderView() System.Web.WebPages.WebPageBase.ExecutePageHierarchy() // no versión virtual System.Web. WebPages.WebPageBase.PushContext()
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() // virtuales versión this.Execute() // El código generado de nuestra vista
System.Web.WebPages.WebPageBase.PopContext
RenderSurrounding (virtualPath, cuerpo); // Render Layout, que es similar al proceso de renderización de View, esencialmente puede haber anidado Layout VerifyRenderdBodyOrSetions();

Quiero añadir código para mis puntos de vista y el diseño que traza la posición lógica real en la página.

¿Hay alguna manera de conectar un método para ejecutar justo antes de RenderSurrounding y justo después deRenderBody termina de ejecutar?

+0

'RenderBody' es invocado por el diseño (al menos en los proyectos de pareja MVC en los que he trabajado). Posiblemente pueda envolver 'RenderSurrounding' en un helper (si no es ya uno) y agregarlo antes y después de la llamada a' RenderBody' en el diseño. –

+0

@ M.Babcock idealmente estoy buscando un gancho en el marco que no implica cambios de diseño –

+0

Pero su pregunta dice: * Quiero agregar código a mis vistas y el diseño que rastrea la posición lógica real en la página. * Así que aren ¿Estás buscando cambiar el diseño de todos modos? –

Respuesta

5

se puede anular el método ExecutePageHierarchy en la propia página mediante la creación de un tipo base diferente para sus páginas, dada una aplicación WebViewPage así:

public abstract class CustomViewPage<TModel> : WebViewPage<TModel> 
{ 
    public override void ExecutePageHierarchy() 
    { 
     Output.Write("Before"); 
     base.ExecutePageHierarchy(); 
     Output.Write("After"); 
    } 
} 

Va a obtener una salida justo antes y después del contenido de la página real (y por lo tanto dentro del diseño). No estoy seguro si eso es lo que estás buscando, ¿estás tratando de simplemente escribir los guiones en </body>, me imagino?

Lo principal es el uso de este tipo de un tipo base de sólo el .cshtml principal (no cualquier parciales o sobre la disposición) va a proporcionar esos Output.Write s alrededor del RenderBody de salida de la disposición (bueno en realidad, sólo en el interior)

Puede establecer el tipo de base por directorio en el web.config.

Cuestiones relacionadas