如果我的问题很愚蠢,我是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">© @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()
,因为在这里我会再次显示部分视图。
任何帮助都将不胜感激。
答案 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";
}
我希望你明白为什么会收到这个错误。