嵌套布局MVC5

时间:2016-03-09 14:28:16

标签: asp.net-mvc-5

如果我的问题很愚蠢,我是MVC新手,请原谅。

我有一个主布局文件(_MainLayout.cshtml)和一个辅助布局文件(_AdminLayout.cshtml)。这两个文件都位于我的/ Views / Shared文件夹中。

_MainLayout.cshtml看起来像:

<!DOCTYPE html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="shortcut icon" type="image/x-icon" href="~/icons/favicon.ico" />
    <title>U - @ViewData["Title"]</title>
    <link rel="stylesheet" href="~/Content/Site.css"/>
</head>
<body>
    <nav>
        <div id="MainMenu" style="top:45px; height:40px; width:100%; position:fixed">
            <ul style="list-style-type:none; text-align:center">
                <li class="u-li-rightfloatinglink">@Html.ActionLink("Admin", "_AdminLayout", "Admin")</li>
                <li class="u-li-rightfloatinglink">@Html.ActionLink("Contact", "Contact", "Home")</li>
                <li class="u-li-rightfloatinglink">@Html.ActionLink("About", "About", "Home")</li>
                <li class="u-li-rightfloatinglink">@Html.ActionLink("Home", "Index", "Home")</li>
            </ul>
        </div>
    </nav>
    <div id="MainBody" style="top: 80px; width:100%; text-align:center; position:fixed">
        @RenderBody()
    </div>
    <div id="MainFooter" style="position:fixed; bottom:0px; width:100%; height:20px; background:#015da0">
        <p style="display:table-cell; color:#ffffff; text-align:center; vertical-align: middle">&copy; @DateTime.Now.Year - U</p>
    </div>
    @RenderSection("scripts", required: false)
</body>

_AdminLayout.cshtml如下所示:

@{
    ViewBag.Title = "_AdminLayout";
    Layout = "~/Views/Shared/_MainLayout.cshtml";
}

<h2>_AdminLayout</h2>
<div>
    @RenderBody()
</div>

ManageTableContent.cshtml再次应该显示在_AdminLayout.cshtml的@RenderBody部分。

ManageTableContent.cshtml看起来像:

@{
    Layout = "~/Views/Shared/_AdminLayout.cshtml";
    ViewBag.Title = "Manage Table Content";
}
<body>
    <div class="u-div-header">
        <p class="u-p-header">Manage Table Content</p>
    </div>
    <br />
    <div style="width: 100%">
        <table class="u-table-layouttable">
            <tr>
                <td class="u-td-description">Table Name here</td>
                <td class="u-td-buttons">
                    <button class="u-button-addrecord" title="Add Record">
                        <img />
                    </button>
                    <button class="u-button-deleterecord" title="Delete Record">
                        <img />
                    </button>
                    <button class="u-button-clonerecord" title="Clone Record">
                        <img />
                    </button>
            </tr>
            <tr>
                <td colspan="2">
                    <table id="ManagedTable" class="u-table-datatable">
                        <tr class="u-tr-datatable">
                            <td></td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
        <table style="width: 100%">
            <tr>
                <td>
                    <input id="Submit" type="submit" value="Submit" style="float: right" />
                    <input id="Cancel" type="reset" value="Cancel" style="float: right" />
                </td>
            </tr>
        </table>
    </div>
</body>

出于某种原因,当我尝试通过从_MainLayout.cshtml中选择管理员链接来打开我的_AdminLayout.cshtml时出现此错误:

Additional information: The file "~/Views/Shared/_AdminLayout.cshtml" cannot be requested directly because it calls the "RenderBody" method.

控制器代码:

namespace U.Controllers
{
    public class AdminController : Controller
    {
        // GET: Admin
        public ActionResult ManageTableContent()
        {
            return View();
        }
        public ActionResult _AdminLayout()
        {
            ViewBag.Message = "Your admin page.";

            return View();
        }
    }
}

如果我从代码中删除@RenderBody(),则_AdminLayout.cshtml加载正常。 我需要_AdminLayout.cshtml中的@RenderBody(),因为在这里我会再次显示部分视图。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

每个主布局只能有一个@RenderBody()(这是View输出的位置)。

如果_AdminLayout.cshtml不是主布局,那么您应该使用@RenderPartial在那里插入部分视图。

答案 1 :(得分:1)

根据您的评论, 当你调用_AdminLayout动作时 然后它会自动调用_AdminLayout.cshtml,因为它在视图文件中有@RenderBody()方法,它会出错。动作控制器视图无法保存@RenderBody()。

你可以这样做。将ActionResult _AdminLayout名称更改为AdminLayout。

并创建另一个名为AdminLayout.cshtml的视图文件。

在那个cshtml中你可以这样编码。

 @{
  Layout = "~/Views/Shared/_AdminLayout.cshtml";
  ViewBag.Title = "Manage Table Content";
 }

我希望你明白为什么会收到这个错误。