ignore renderbody in razor _layout.cshtml

2019-07-15 08:11发布

问题:

I have a page for what u need to be signed in to watch it. So I want to try this code:

<!DOCTYPE html>
<html lang="de">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta charset="utf-8" />
    <title>@ViewBag.Title - Meine ASP.NET MVC-Anwendung</title>
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <meta name="viewport" content="width=device-width" />
    @Styles.Render("~/Content/css")
    @if (!Request.IsAuthenticated) {
        @Styles.Render("~/Content/signin")
    }
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    @if (Request.IsAuthenticated) {
        <header class="navbar navbar-fixed-top" role="banner">
            <div class="container">
                <div class="navbar-header">
                    <button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    <a class="navbar-brand" href="../">Home</a>
                </div>
                <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
                    <ul class="nav navbar-nav">
                        <li class="active">
                            <a href="#">Link 1</a>
                        </li>
                        <li>
                            <a href="#">Link 2</a>
                        </li>
                        <li>
                            <a href="#">Link 3</a>
                        </li>
                        <li>
                            <a href="#">Link 4</a>
                        </li>
                        <li>
                            <a href="#">Link 5</a>
                        </li>
                    </ul>
                </nav>
            </div>
        </header>
        <div id="body">
            @RenderBody()
        </div>
    } else {
        @RenderBody()
    }
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/bootstrap")
    <footer>
        <p>&copy; @DateTime.Now.Year - Meine ASP.NET MVC-Anwendung</p>
    </footer>
</body>
</html>

But when I start this I get this exception

The RenderBody-Method wasn't called for the layoutpage "~/Views/Shared/_Layout.cshtml"

How can I make razor ignore the RenderBody-method?

回答1:

Note that you actually can "ignore" the content if you really want to. Normally you write @RenderBody() in your view code, which evaluates the body content, sticks it in a HelperResult, and then writes that to the output stream. In doing so, MVC marks the body as having been rendered. You can trick it into thinking the body has been rendered without actually writing anything by writing @{ RenderBody(); } (notice the braces) or just RenderBody(); if already in a code context. This evaluates the body content without actually writing it to the output stream.