我有一个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 。
答案 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);
}
}