有没有办法解决RenderBody()的要求?

Jez*_*Jez 5 c# asp.net-mvc razor

我有一个ASP.NET MVC Web应用程序,其中所有页面都使用单个母版Layout.cshtml页.虽然我通常想RenderBody(),我有一个可以在我的数据库中启用的站点关闭机制,所以我基本上想要一个看起来像这样的布局页面:

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

麻烦的是,如果SiteIsShutDown是真的,那么RenderBody()不会被调用,我得到异常:

尚未为布局页面调用"RenderBody"方法...

那么我有办法解决这个问题吗?我只是想从我的布局页面渲染一些输出,而不是我的视图页面.

Jer*_*ose 5

您可能应该将主布局保留为渲染视图,而不是在站点关闭时使视图短路.

你最好的选择是检查这个并在Global.asax中处理它,即BeginRequest:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if(DbHelper.SiteIsShutDown)
    {
        HttpContext.Current.Response.Redirect("SiteDown");
    }
}
Run Code Online (Sandbox Code Playgroud)


Jez*_*Jez -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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 投票给你自己的答案确实不酷,但更不酷的是使用另一个人的答案并稍微修改它,只是为了做出不同的答案...... (2认同)