【问题标题】:how to ignore @RenderBody() inside if condition如何在 if 条件下忽略 @RenderBody()
【发布时间】:2018-09-20 19:39:17
【问题描述】:

我有一个验证条件的页面。 if condition true 显示不同的页面 else 显示登录页面。

@if (sitemaintainmode == "false")
{
    <body>
   
        <div class="navbar navbar-default">
            <div class="container">
          
                    @Html.Partial("_LoginPartial")
               
            </div>
        </div>

        <div class="container body-content">
            @RenderBody()
        </div>
        @Html.Partial("_Footer")

      
        </script>
    </body>
}
else
{
   @RenderPage("~/Views/Account/Error.cshtml"); 
    
}

但它给了我一个错误 -

尚未为布局页面“~/Views/Shared/_Layout.cshtml”调用“RenderBody”方法。

【问题讨论】:

  • 这在控制器中处理会比布局页面好得多
  • 是的。在MVC 应用程序中,通常会在您到达实际视图呈现的位置之前做出此类决定。我看到你检查维护。在这种情况下,更改路由可能是更好的解决方案,并在站点维护时将所有请求重定向到默认操作。
  • 从 web.config 还是从控制器路由?
  • @Hob 检查这个问题:stackoverflow.com/questions/7580911/… 我认为它非常接近您想要实现的目标,但方式更好。
  • 不要这样做。您正在添加要查看的逻辑。视图只是用来表示数据。本例中的 逻辑 应该在控制器(或 ActionFilter)中完成,如果确定显示登录页面,则重定向到那里。

标签: c# asp.net-mvc razor


【解决方案1】:

你不能忽视 RenderBody() 在您的代码中,因为您可能会在您的 cshtml 页面中使用此 Layout="~/Views/Shared/_Layout.cshtml"

创建单独的customeErrorPage(视图)并在Controller中处理您的条件并使用return RedirectToAction("Login Or Error") or use return View("Login or Errorpage")

希望这会对你有所帮助。

【讨论】:

  • 谢谢!!正如你所建议的,我在控制器中添加了一个条件。有效。 public ActionResult Login(string returnUrl) { var sitemaintainmode = ConfigurationManager.AppSettings["IsSiteMaintenanceMode"]; if(sitemaintainmode == "true") { return View("Error"); } else { 返回视图(“登录”); } }
【解决方案2】:

您可以在控制器中处理操作结果,在 Account 控制器中重定向到错误视图或在 web.config 中使用 customError。例如:

<customErrors mode="RemoteOnly" defaultRedirect="~/Home/Error_Generic/" >
  <error statusCode="500" redirect="~/Account/Error" />
</customErrors>

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    相关资源
    最近更新 更多