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

时间:2012-11-14 16:46:45

标签: 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()
}

问题是,如果SiteIsShutDown为真,则RenderBody()不会被调用,我得到例外:

  

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

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

3 个答案:

答案 0 :(得分:5)

您可能应该将主布局留给渲染视图,而不是在站点关闭的情况下使视图短路。

最好的办法是检查并在Global.asax中处理,即BeginRequest

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

答案 1 :(得分:3)

请注意,如果您真的想要,实际上可以“忽略”内容。通常,您在视图代码中编写@RenderBody(),它会评估正文内容,将其添加到HelperResult中,然后将其写入输出流。这样做,MVC将身体标记为已渲染。你可以通过编写@{ RenderBody(); }(注意大括号)或只是RenderBody();(如果已经在代码上下文中)来欺骗它认为身体已被渲染而不实际写任何东西。这会评估正文内容,而不会将其实际写入输出流。

答案 2 :(得分:-3)

最后我决定使用与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);
    }
}