如何加载视图而不重新加载MVC 4中的布局?

时间:2013-08-22 05:53:05

标签: jquery ajax asp.net-mvc asp.net-mvc-4

我正在使用ASP.NET MVC 4.我有一个稍微重一点的“导航菜单”和“标题”,这对所有页面都很常见。

我在布局中创建了所有菜单和标题内容,但在每个导航中,浏览器重新加载菜单。有没有可能的方法来防止重新加载布局页面?

我正在使用_ViewStart.cshtml将视图与布局绑定。

3 个答案:

答案 0 :(得分:8)

假设这将是您呈现的HTML菜单

   <ul class="menu">
      <li><a href="/about/index">About</a></li>
      <li><a href="/contact/index">Contact</a></li>
   </ul>
   <div id="page-content">
   </div>

您的视图页面将在以下结构中创建为部分视图

About/index.cshtml
Contact/index.cshtml

注意: MVC部分视图不会有<html> or <head> or <body>,它只会有内容,类似于ASP.Net中的用户控件。你cannot use @section in partial views

现在您只需要使用ajax加载此部分内容,并使用javascript将其放置在页面内容的主占位符div中

$(document).ready(function(){
$("ul.menu a").click(function(e){
  e.preventDefault(); // prevent default link button redirect behaviour     
  var url=$(this).attr("href");
  $('#page-content').load(url);
 });
});

希望这会对你有帮助!

答案 1 :(得分:1)

如果它们对所有页面都是通用的,您应该尝试缓存导航菜单和标题。

如果您的结果视图由

组成
  1. 标题
  2. 导航
  3. 菜单内容
  4. 你可以使用布局

    @Html.RenderAction("header")
    @Html.RenderAction("navigation")
    @Render.Body()
    

    “标题”和“导航”操作被大量缓存。

    @Haacked在这里提到了这篇精彩的博文http://haacked.com/archive/2009/05/11/donut-hole-caching.aspx

    这种方法可以清楚地区分您对标题和导航的关注。您可以专注于当前调用的动作显示的实际内容。

    希望这有帮助

    注意:此答案超级简化,如果您的导航基于访问页面的用户的角色/权限,则必须在执行缓存时考虑动态参数和内容。

答案 2 :(得分:0)

最好的方法是从控制器返回一个局部视图:

return PartialView();

您还可以通过添加到顶部来覆盖正在加载的局部视图布局中的 _layout:

@{
    Layout = null;
}