对于包含 _layout.cshtml 并加载了包的 MVC 项目,每次加载视图时单击都会加载布局和包。是否有任何内置机制可用于仅在最初加载这些内容,以便 RenderBody() 仅加载我还没有的内容(不重新加载布局)?这是局部派进来的地方吗?
如果部分是处理它的正确方法,这是否意味着我需要每个控制器方法的两个版本(一个有布局,一个没有)?这里的任何提示都会很棒。
对于包含 _layout.cshtml 并加载了包的 MVC 项目,每次加载视图时单击都会加载布局和包。是否有任何内置机制可用于仅在最初加载这些内容,以便 RenderBody() 仅加载我还没有的内容(不重新加载布局)?这是局部派进来的地方吗?
如果部分是处理它的正确方法,这是否意味着我需要每个控制器方法的两个版本(一个有布局,一个没有)?这里的任何提示都会很棒。
据我所知,没有内置机制可以一次加载布局页面。如果您希望仅一次加载该布局,则可以使用客户端方法执行此操作,以便服务器更轻。这是步骤。创建 MVC 4 应用程序。
在您的 _Layout.cshtml 添加一个 div 来保存您要加载的 html 页面。在我的情况下“页面持有人”
<div id="body">
<div id="pageholder">
@RenderSection("featured", required: false)
<section class="content-wrapper main-content clear-fix">
@RenderBody()
</section>
</div>
</div>
在您的 _Layout.cshtml 中添加此脚本
@Scripts.Render("~/Scripts/common.js")
<script type="text/javascript">
$(document).ready(function() {
$('.pagelink').click(function() {
var settings = {
'url': $(this).attr('url'),
'type': 'GET',
'dataType':'html'
};
get_html(settings);
});
});
</script>
修改您的菜单链接
<nav>
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li><a href="#" class="pagelink" url="/home/about">About</a></li>
<li> <a href="#" class="pagelink" url="/home/contact">Contact</a></li>
</ul>
</nav>
添加js文件并将其命名为common.js并放入此内容
function get_html(settings) {
settings.success = function(data) {
$('#pageholder').empty().html(data);
};
settings.error = function (xhr, ajaxOptions, thrownError) {
alert(xhr.statusText);
};
$.ajax(settings);
}
设置布局 = null; 关于和联系人视图
@{
ViewBag.Title = "About";
Layout = null;
}
运行应用程序并测试 About 和 Contact 页面