C# 有没有办法绕过RenderBody()要求?
我有一个ASP.NET MVC web应用程序,所有页面都使用一个主控C# 有没有办法绕过RenderBody()要求?,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我有一个ASP.NET MVC web应用程序,所有页面都使用一个主控Layout.cshtmlpage。虽然我通常希望RenderBody(),但我有一个可以在数据库中启用的站点关闭机制,因此我基本上希望有一个类似以下内容的布局页面: @if(DbHelper.SiteIsShutDown) { <h1>Site is shut down temporarily</h1> } else { <h1>Welcome to the site<
Layout.cshtml
page。虽然我通常希望RenderBody()
,但我有一个可以在数据库中启用的站点关闭机制,因此我基本上希望有一个类似以下内容的布局页面:
@if(DbHelper.SiteIsShutDown) {
<h1>Site is shut down temporarily</h1>
}
else {
<h1>Welcome to the site</h1>
@RenderBody()
}
@if(DbHelper.siteishutdown){
网站暂时关闭
}
否则{
欢迎来到这个网站
@RenderBody()
}
问题在于,如果SiteIsShutDown
为true,则不会调用RenderBody()
,我会得到异常:
尚未为布局页调用“RenderBody”方法
有什么办法可以让我绕过这件事吗?我只想从我的布局页面中呈现一些输出,而不想从我的视图页面中呈现任何内容。您可能应该将主布局留给呈现视图,而不是在站点关闭时短路视图 您最好检查并在Global.asax中处理它,即在
BeginRequest
中:
protected void Application_BeginRequest(object sender, EventArgs e)
{
if(DbHelper.SiteIsShutDown)
{
HttpContext.Current.Response.Redirect("SiteDown");
}
}
最后,我决定采用与Jerad Rose的解决方案非常相似的解决方案,但进行了修改,使其只在根目录下提供一个名为
sitedabled.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);
}
}
请注意,如果您真的愿意,您实际上可以“忽略”内容。通常,您在视图代码中编写
@RenderBody()
,该代码评估正文内容,将其粘贴到帮助错误结果中,然后将其写入输出流。这样,MVC将主体标记为已渲染。您可以通过编写@{RenderBody();}
(注意大括号)或只编写RenderBody(),使其认为主体已经渲染,而实际上没有编写任何内容代码>如果已经在代码上下文中。这会评估正文内容,而不实际将其写入输出流。是否有一种方法可以显示“站点关闭”视图而不使用重定向?投票给自己的答案确实不酷,但更不酷的是使用另一个人的答案并稍微修改它,只会生成不同的答案。。。