5

ASP.NET MVC Web アプリケーションがあり、すべてのページで 1 つのマスターLayout.cshtmlページが使用されています。通常は必要ですがRenderBody()、データベースで有効にできるサイトシャットダウンメカニズムがあるため、基本的には次のようなレイアウトページが必要です。

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

問題は、ifSiteIsShutDownが true の場合RenderBody()に呼び出されず、例外が発生することです。

レイアウト ページの「RenderBody」メソッドが呼び出されていません...

それで、これを回避する方法はありますか?レイアウト ページからの出力をレンダリングしたいだけ、ビュー ページからは何もレンダリングしたくありません。

4

3 に答える 3

5

おそらく、マスター レイアウトをビューのレンダリングに残し、サイトがシャットダウンした場合にビューを短絡させないようにする必要があります。

これを確認し、Global.asax、つまり次のように処理することをお勧めしますBeginRequest

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if(DbHelper.SiteIsShutDown)
    {
        HttpContext.Current.Response.Redirect("SiteDown");
    }
}
于 2012-11-14T17:08:54.907 に答える
3

本当に必要な場合は、実際にコンテンツを「無視」できることに注意してください。通常@RenderBody()、本文のコンテンツを評価し、それを に貼り付けHelperResultてから、出力ストリームに書き込みます。そうすることで、MVC は本文がレンダリング済みとしてマークされます。@{ RenderBody(); }書くことで(中括弧に注意してください)、またはRenderBody();既にコード コンテキスト内にある場合は、実際には何も記述せずにボディがレンダリングされたと思わせることができます。これは、実際に出力ストリームに書き込むことなく、本文の内容を評価します。

于 2014-12-18T22:06:40.347 に答える
-4

最終的に、私は Jerad Rose のソリューションに非常に似たものを使用することにしましたが、ルートで という静的ファイルを提供するようにSiteDisabled.htm変更し、サイトが無効:

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);
    }
}
于 2012-12-07T12:18:22.073 に答える