2012-11-14 8 views
5

Ich habe eine ASP.NET MVC-Webanwendung, alle Seiten, in denen eine einzige Master Layout.cshtml Seite verwenden. Obwohl in der Regel bis ich RenderBody() will, muss ich Mechanismus eine Website Abschaltung, die in der Datenbank aktiviert werden kann, um im Grunde genommen haben, ich möchte eine Layoutseite, die etwas wie folgt aussieht: Das Problem ist,Gibt es eine Möglichkeit, die Anforderung von RenderBody() zu umgehen?

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

, dass, wenn SiteIsShutDown wahr ist, dann ist RenderBody() nicht aufgerufen und ich bekomme die Ausnahme:

die „Render“ Methode nicht für Layout-Seite aufgerufen hat ...

So ist es eine Möglichkeit, die ich bekommen kann um diese? I nur möchten einige Ausgabe von meiner Layout-Seite, und nichts von meiner Ansichtsseite.

Antwort

-3

Am Ende habe ich mit etwas ziemlich ähnlich wie Jerad Rose-Lösung entschieden zu gehen, aber so modifiziert, dass es SiteDisabled.htm, und auch modifiziert, so genannte Wurzel serviert nur eine statische Datei auf dem, dass es nicht in eine unendliche Schleife Umleitung gehen wird, wenn die Seite deaktiviert ist:

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

Abstimmung für Ihre eigene Antwort ist wirklich nicht cool, aber was noch weniger cool ist, verwendet die Antwort eines anderen Kerls und leicht modifizieren, nur um eine andere Antwort zu geben ... –

5

Sie sollten das Master-Layout wahrscheinlich auf Rendering-Ansichten belassen und Ihre Ansichten bei einem Standort-Shutdown nicht kurzschließen.

Sie sind die beste Wahl ist für diese und behandeln sie in Global.asax, das heißt in BeginRequest zu überprüfen:

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

Wäre es möglich, eine "Site Shut Down" Ansicht anzuzeigen, ohne eine Umleitung zu verwenden? – Jez

3

Beachten Sie, dass Sie tatsächlich „ignorieren "Der Inhalt, wenn Sie wirklich w ant an. Normalerweise schreiben Sie @RenderBody() in Ihrem Ansichtscode, der den Body-Inhalt auswertet, in einem HelperResult steckt und dann in den Ausgabestream schreibt. Dabei kennzeichnet MVC den Körper als gerendert. Sie können es so austricksen, dass Sie denken, dass der Körper gerendert wurde, ohne etwas zu schreiben, indem Sie @{ RenderBody(); } schreiben (beachten Sie die geschweiften Klammern) oder einfach nur RenderBody();, wenn bereits in einem Code-Kontext. Dies wertet den Body-Inhalt aus, ohne ihn tatsächlich in den Ausgabestream zu schreiben.

Verwandte Themen