2012-11-14 12 views
5

Possiedo un'applicazione Web ASP.NET MVC, tutte le pagine in cui viene utilizzata una singola pagina master Layout.cshtml. Anche se di solito voglio RenderBody(), ho un meccanismo sito arresto che può essere attivata nel mio database così ho praticamente voglio avere una pagina di layout che assomiglia a:Esiste un modo per aggirare il requisito RenderBody()?

@if(DbHelper.SiteIsShutDown) { 
    <h1>Site is shut down temporarily</h1> 
} 
else { 
    <h1>Welcome to the site</h1> 
    @RenderBody() 
} 

Il guaio è che se SiteIsShutDown è vero, poi RenderBody() non viene chiamato e ottengo l'eccezione:

il metodo "RenderBody" non è stato chiamato per il layout di pagina ...

quindi c'è un modo per ottenere intorno a questo? I solo voglio rendere un po 'di output dalla mia pagina di layout, e niente dalla mia pagina di visualizzazione.

risposta

-3

Alla fine ho deciso di andare con qualcosa di molto simile alla soluzione di Jerad Rose, ma modificato in modo serve solo un file statico alla radice chiamato SiteDisabled.htm, e anche modificato in modo che non va in un loop di reindirizzamento infinito quando il sito è disattivato:

protected void Application_BeginRequest(object sender, EventArgs ea) { 
    string siteDisabledFilePath = "/SiteDisabled.htm"; 

    if (CachingAndUtils.IsSiteDisabled && HttpContext.Current.Request.FilePath != siteDisabledFilePath) { 
     HttpContext.Current.Response.Redirect(siteDisabledFilePath); 
    } 
} 
+2

votare per la tua risposta non è proprio bello, ma quello che è ancora meno interessante è usare la risposta di un altro ragazzo e modificarla leggermente, solo per fare una risposta diversa ... –

5

Probabilmente si dovrebbe lasciare il layout principale alle visualizzazioni di rendering e non cortocircuitare le visualizzazioni in caso di arresto del sito.

Sei migliore da fare è quello di verificare per questo e gestirlo in Global.asax, cioè in BeginRequest:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if(DbHelper.SiteIsShutDown) 
    { 
     HttpContext.Current.Response.Redirect("SiteDown"); 
    } 
} 
+0

Ci sarebbe un modo per visualizzare una vista "sito spento" senza utilizzare un reindirizzamento? – Jez

3

si noti che in realtà si può "ignorare "il contenuto se davvero w ant. Normalmente scrivi @RenderBody() nel tuo codice di vista, che valuta il contenuto del corpo, lo infila in un HelperResult e poi lo scrive nel flusso di output. In tal modo, MVC contrassegna il corpo come reso. Puoi ingannarlo pensando che il corpo sia stato reso senza scrivere nulla scrivendo @{ RenderBody(); } (nota le parentesi graffe) o solo RenderBody(); se già in un contesto di codice. Questo valuta il contenuto del corpo senza effettivamente scriverlo nel flusso di output.

Problemi correlati