MVC 4:为什么“_Layout.cshtml”无法在Home View上呈现?

时间:2014-03-10 21:28:24

标签: asp.net-mvc asp.net-mvc-4 razor

我是MVC Development的新手,已经开始使用新的MVC 4应用程序来构建一种个人投资组合。我无法弄清楚为什么我的_Layout.cshtml没有在我的家中呈现或默认View。我已经检查了以下内容:

  1. App_Start/RouteConfig.cs文件以来未被修改过 应用程序已创建。
  2. Views/Shared/_ViewStart.cshtml有 以下(默认):

    @{
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
  3. 查看/共享/ _Layout.cshtml:

            <!DOCTYPE html>
        <html>
            <head>
                <meta charset="utf-8" />
                <meta name="viewport" content="width=device-width, initial-scale = 1.0" />
                <title>Portfolio</title>
                @Styles.Render("~/Content/css")
                @Scripts.Render("~/bundles/jquery")
                @Scripts.Render("~/bundles/bootstrapjs")
                @Scripts.Render("~/bundles/customJs")
                <link href="~/Content/bootstrap.css" rel="stylesheet" />
                <link href="~/Content/bootstrapMod.css" rel="stylesheet" />
                <link href="~/Content/Site.css" rel="stylesheet" />
            </head>
            <body style=""zoom: 1">
                <div class="container mainContent">
                    <div class="page-header hidden-sm hidden-xs">
                        @Html.Partial("_Header")
                    </div>
    
                    <nav id="navBar" class="navbar navbar-default" role="navigation">
                        <div class="container-fluid">
                            <!-- Brand and toggle get grouped for better mobile display -->
                            <div class="navbar-header">
                                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse">
                                    &#9776;
                                </button>
                                <a class="navbar-brand hidden-lg hidden-md" href="/Home">Portfolio</a>
                            </div>
    
                            <!-- Collect the nav links, forms, and other content for toggling -->
                            <div class="collapse navbar-collapse" id="navbar-collapse">                    
                               @*@Html.MvcSiteMap().Menu()*@
    
                            </div>
                        </div>
                    </nav>
    
                    <div class="container">
                        @RenderSection("scripts", required:false)
    
                        <div class="pageTitle largeFontSize">
                            @ViewBag.HeaderTitle
                        </div>
    
                        @RenderBody()
                    </div>
    
    
                </div>
                <div id="footer">
                    Copyright 2014 - Portfolio - <a target="_blank" href="/terms-and-conditions-of-us.html">Website Terms &amp; Conditions of Use</a>
                </div>
            </body>
        </html>
    

    〜/查看/共享/ _Header.cshtml

    <div class="row">
        <div class="col-md-6">
            <div>
                <a href="~/Home">
                    <img src="~/Content/Images/Header.png" class="img-responsive"/>
                </a>
            </div>
        </div>
        <div class="col-md-6 box">
            @if (Request.IsAuthenticated)
            {
                <div class="profileLinks">                    
                    <a href="#">My Projects</a>
                    |
                    <a href="#">Contact Profile</a>
                </div>
    
                <div class="content logout">                
                    <div class="row">
                        <div>
                            Hi, @User.Identity.Name
                            @Html.ActionLink("Log Off", "LogOff", "Account", new {},new { @class = "btn btn-primary btn-sm" })
                        </div>
                    </div>                
                </div>
            }
            else
            {
                <div class="content">
                    <div class="row">
                        <div class="col-md-4">
                            <input type="text" id="username" placeholder="E-mail" required tabindex="1"/>
                            <a href="#" ><h6>Forgot your username?</h6></a>
                        </div>
                        <div class="col-md-4">
                            <input type="password" id="password" placeholder="Password" required tabindex="2" onkeyup="EnterKeyPressed()"/>
                            <a href="#" ><h6>Forgot your password?</h6></a>
                        </div>
                        <div class="col-md-4">
                            <input type="button" id="loginButton" value="Login" onclick="login()" class="btn btn-primary btn-sm" tabindex="3" onkeyup="EnterKeyPressed()"/>
                            <br />
                            <input type="checkbox" id="rememberMe">Remember Me
                        </div>
                    </div>
                </div>
            }
        </div>
    </div>
    

    我的默认视图加载,但没有任何内容。标题更改为“索引”,其余为空白页。 ~/Views/Shared/_Layout.cshtml不应该以某种方式在此页面内呈现吗?

    根据我目前设置的内容,当共享的_Layout.cshtml加载到我的Home/Index/视图中时,我应该会看到我在共享视图中创建并获取的页眉图像。

    查看/主页/ Indx.cshtml

    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
    </head>
    <body>
        <div>
    
        </div>
    </body>
    </html>
    

    当我尝试Layout = "~/Views/Shared/_Layout.chtml";时,它错误地说在指定的路径上找不到它。我是一个开发人员朋友发给我的一个例子的半工作,并且有了它,他们没有明确地设置Layout

3 个答案:

答案 0 :(得分:7)

一些事情......

如果您有一个视图,您试图在共享视图中进行渲染,那么您不需要将其放入视图中的任何HTML布局元素。让我们从真正的基础开始。

查看开始

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

_Layout.cshtml

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width" />
        <title>@ViewBag.Title</title>
</head>
<body>
    @RenderBody()
</body>
</html>

主页视图

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

现在主页视图会显示@RenderBody()出现的位置。因此索引将是页面中的标题2。标题在ViewBag对象中传递,并在_Layout.cshtml文件中设置为页面标题,其中包含以下@ViewBag.Title

答案 1 :(得分:4)

删除Index.cshtml中的以下内容

@{
    Layout = null;
}

此代码告诉渲染引擎不使用共享布局。您也不需要索引中的任何HTML pre-amble(HTML,HEAD或BODY标记)。

答案 2 :(得分:1)

删除

@{ Layout = null } 

或明确将其设置为“〜/ Views / Shared / _Layout.cshtml”;但这不太可取。

它覆盖了_ViewStart行为。

此外,您不需要在index.cshtml视图中包含这些标记,因为它们包含在_Layout.cshtml中。

基本上发生的事情是您正在创建一个包含_Layout的包装页面,您可以在其中放置网站中常见的内容(例如页眉,页脚,某些导航)。然后创建一个视图,在本例中为index.cshtml,它构成页面的主体。 _Layout.cshtml和Index.cshtml被编译成单个页面,_Layout.cshtml就像是一个围绕Index.cshtml的包装器。