2012-02-15 13 views
8

Quando ASP.NET MVC esegue una pagina contenente Razor, esegue prima il corpo, ad esempio il metodo RenderBody, quindi esegue il codice per il layout e lo intreccia.Esistono hook in ASP.NET MVC prima dell'esecuzione del layout e del rendering del corpo postale?

questo è documentato in questo blog post:

System.Web.Mvc.RazorView.RenderView() System.Web.WebPages.WebPageBase.ExecutePageHierarchy() // non virtuale versione System.Web. WebPages.WebPageBase.PushContext()
System.Web.WebPages.WebPageBase.ExecutePageHierarchy() // virtuale versione this.Execute() // codice generato dalla nostra vista
System.Web.WebPages.WebPageBase.PopContext
RenderSurrounding (virtualPath, body); // Render Layout, che è simile al processo di rendering di View, in pratica puoi avere nidificato Layout VerifyRenderdBodyOrSetions();

Voglio aggiungere il codice per le mie opinioni e il layout che ricalca l'attuale posizione logica nella pagina.

C'è un modo per collegare un metodo per eseguire poco prima RenderSurrounding e subito dopoRenderBody termina l'esecuzione?

+0

'RenderBody' viene richiamato dal layout (almeno nei progetti MVC coppia su cui ho lavorato). Potresti racchiudere 'RenderSurrounding' in un helper (se non lo è già) e aggiungerlo prima e dopo la chiamata a' RenderBody' nel layout. –

+0

@ M.Babcock idealmente sto cercando un gancio nel framework che non comporta modifiche al layout –

+0

Ma la tua domanda dice: * Voglio aggiungere codice alle mie viste e layout che traccia la posizione logica effettiva nella pagina. stai cercando di cambiare il layout comunque? –

risposta

5

è possibile ignorare il metodo ExecutePageHierarchy nella pagina stessa con la creazione di un tipo di base diversa per le vostre pagine, dato un WebViewPage implementazione come questo:

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

Si otterrà uscita immediatamente prima e dopo il contenuto della pagina attuale (e quindi all'interno del layout). Non sono sicuro se questo è quello che stai cercando, stai cercando di scrivere gli script a </body> immagino?

La cosa principale è usare questo tipo di un tipo di base solo per il principale .cshtml (non parziali o sul layout) renderà quelli Output.Write s intorno all'output RenderBody del layout (beh davvero, solo all'interno).

È possibile impostare il tipo di base per directory nel web.config.

Problemi correlati