5

我有一个 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”方法...

那么有没有办法解决这个问题?我只想从我的布局页面呈现一些输出,而不是从我的视图页面呈现任何内容。

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()在视图代码中编写,该代码评估正文内容,将其粘贴在 aHelperResult中,然后将其写入输出流。这样做时,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 回答