我正在使用MVC 3创建原型项目,我遇到的情况似乎无法找到答案,似乎我可能会以错误的方式解决问题。
快速浏览我的项目;它基于您使用Visual Studio获得的MVC模板,我使用提供的_Layout视图上的链接(选项卡)来访问我的其他一些视图。其中一个链接打开第二个部分视图,该视图再次包含更多视图的链接(特定于管理员。因此拆分)。我遇到的问题是我似乎无法在第二个局部视图中显示@RenderBody
的视图,我理解这是因为在完整的HTML中你不能有多个@RenderBody
文件,这是有道理的。
所以我的问题是,如何以这种方式显示视图?此外,更重要的是,这是实现我正在尝试的“子菜单”系统的正确方法还是有更好的方法来实现这一目标?
以下是视图的相关部分,首先是'main'_Layout文件:
<body>
<div class="page">
<header>
<div id="title">
<h1>Test App</h1>
</div>
<nav>
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
@if (User.Identity.IsAuthenticated)
{
<li>@Html.ActionLink("Contracts", "List", "Contract", new { user=User.Identity.Name, page=1 }, null)</li>
}
@if (User.IsInRole("Administrator"))
{
<li id="admin">@Html.ActionLink("Administration", "Administration", "Home")</li>
}
</ul>
</nav>
</header>
<section id="main">
@RenderBody()
</section>
<footer>
</footer>
</div>
</body>
单击<li id="admin">@Html.ActionLink("Administration", "Administration", "Home")</li>
链接时,Home控制器将返回如下所示的第二个局部视图:
<header>
<div id="admintitle">
<h1>Administration</h1>
</div>
</header>
<body>
<div id="div-1a">
<nav>
<ul id="adminmenu">
<li>@Html.ActionLink("Contact", "List", "Contact")</li>
<li>@Html.ActionLink("Home", "Index", "Home")</li>
</ul>
</nav>
</div>
<div id="div-1c">
<h1>Test</h1>
</div>
<section id="adminmain">
@RenderBody()
</section>
</body>
当我尝试运行代码时,由于第二个@RenderBody
而失败,这是可以理解的。
如果您需要更多信息,请告知我们。
非常感谢。
答案 0 :(得分:6)
您不能多次使用@RenderBody()
。主_Layout文件中的一个@RenderBody()
足够公平。在第二个视图中,请使用@RenderPartial()
或@RenderAction
。
更新(基于第一条评论)
假设你要呈现/Administrator/TheAction
,那么你将调用
@{
Html.RenderAction("TheAction", "Administrator");
}
TheAction
操作将如下所示:
public PartialViewResult TheAction() {
return PartialView();
}
它会将~/Views/Administrator/TheAction.cshtml
中的视图呈现在您调用RenderAction()
的位置内。
重要的是它没有完成另一个@RenderBody
。正如您在TheAction()
示例中所看到的,您将返回 PartialViewResult ,它没有任何@RenderBody()
帮助器。
答案 1 :(得分:3)
转换
这
<section id="adminmain">
@RenderBody()
</section>
要
<div id="adminmain"></div>
这
@Html.ActionLink("Contact", "List", "Contact")
要
@Ajax.ActionLink("Contact", "List", "Contact", new AjaxOptions { UpdateTargetId = "adminmain" })
在ContactController
List
操作中,返回PartialView()
而不是'View()'。
不要忘记在视图中加入jquery.unobtrusive-ajax
以使Ajax
有效。
在阅读之前Roman's Answer
答案 2 :(得分:0)
我找到了一个解决方案,它将@Roman Mazur和@Mohayemin的答案与AJAX调用结合起来。
我将我的视图更改为以下罗马建议:
public PartialViewResult List() {
return PartialView();
}
然后我按照Mohayemin的建议将该部分更改为div:
<div id="adminmain"></div>
然后我创建了一个链接,在其点击事件上调用AJAX脚本:
<li><a id="load-partial">CONTACTS</a></li>
<script>
$(document).ready(function () {
$('#load-partial').click(function () {
$.ajax({
url: '/Contact/List/',
datatype: 'html',
success: function (data) {
$('#adminmain').empty().html(data);
}
});
});
});
</script>
效果很好,但我总是乐于接受有关如何改进它的更多建议。
非常感谢。
答案 3 :(得分:0)
在使用MVC4中的嵌套部分视图时,我遇到了一些有趣的事情。以防有人偶然发现这个......
在循环中渲染局部视图时,
@Html.Partial()
不起作用。
相反,请使用@Html.RenderPartial();
在前一种情况下,它会发出HTML而不是HTML编码。
干杯!