MVC 3:如何通过ajax加载时如何呈现没有其布局页面的视图?

我正在学习渐进式增强 ,我有一个关于AJAX化视图的问题。 在我的MVC 3项目中,我有一个布局页面,一个viewstart页面和两个普通的视图。

viewstart页面位于Views文件夹的根目录,因此适用于所有视图。 它指定所有的视图应该使用_Layout.cshtml布局页面。 布局页面包含两个导航链接,每个视图一个。 链接使用@Html.ActionLink()来呈现自己到页面。

现在我已经添加了jQuery,并希望劫持这些链接,并使用Ajaxdynamic地在页面上加载他们的内容。

 <script type="text/javascript"> $(function () { $('#theLink').click(function () { $.ajax({ url: $(this).attr('href'), type: "GET", success: function (response) { $('#mainContent').html(response); } }); return false; }); }); </script> 

有两种方法可以做到这一点,但我并不特别喜欢:

1)我可以将整个视图的内容放在一个局部视图中,然后让主视图在渲染时调用局部视图。 这样,在控制器中使用Request.IsAjaxRequest() ,我可以根据请求是否是Ajax请求返回View()或返回PartialView() 。 我不能将常规视图返回到Ajax请求,因为那么它会使用布局页面,我会得到注入布局页面的第二个副本。 但是,我不喜欢这样做,因为它迫使我只用@{Html.RenderPartial();}来创build空视图,而这些视图是针对标准GET请求的。

  public ActionResult Index() { if (Request.IsAjaxRequest()) return PartialView("partialView"); else return View(); } 

然后在Index.cshtml中这样做:

 @{Html.RenderPartial("partialView");} 

2)我可以从_viewstart中删除布局指定,并在请求不是Ajax时手动指定:

  public ActionResult Index() { if (Request.IsAjaxRequest()) return View(); // Return view with no master. else return View("Index", "_Layout"); // Return view with master. } 

有没有人有更好的build议? 有没有办法返回一个没有其布局页面的视图? 如果它是一个ajax请求,明确地说“不包括你的布局”比明确地包含布局,如果它不是ajax要容易得多。

~/Views/ViewStart.cshtml

 @{ Layout = Request.IsAjaxRequest() ? null : "~/Views/Shared/_Layout.cshtml"; } 

并在控制器中:

 public ActionResult Index() { return View(); } 

只需将下面的代码放在页面的顶部

 @{ Layout = ""; } 

我更喜欢和使用你的#1选项。 我不喜欢#2,因为对我来说, View()意味着你正在返回整个页面。 一旦视图引擎完成,它应该是一个完整的,有效的HTML页面。 PartialView()被创build为返回任意的HTML块。

我不认为有一个观点,只是调用一个部分是没有什么大不了的。 它仍然是干的,并允许您在两种情况下使用部分的逻辑。

许多人不喜欢使用Request.IsAjaxRequest()分割他们动作的调用path,我可以理解这一点。 但IMO,如果你正在做的是决定是否调用View()PartialView()那么分支不是一个大问题,易于维护(和testing)。 如果你发现自己使用IsAjaxRequest()来确定你的动作如何发挥,那么做一个单独的AJAX动作可能会更好。

创build两个布局:1.空的布局,2。 主布局,然后在_viewStart文件中写这个代码:

 @{ if (Request.IsAjaxRequest()) { Layout = "~/Areas/Dashboard/Views/Shared/_emptyLayout.cshtml"; } else { Layout = "~/Areas/Dashboard/Views/Shared/_Layout.cshtml"; }} 

当然,也许这不是最好的解决scheme

你不必为此创build一个空的视图。

在控制器中:

 if (Request.IsAjaxRequest()) return PartialView(); else return View(); 

返回PartialViewResult将在呈现respons时覆盖布局定义。

对于Ruby on Rails应用程序,我可以通过在控制器动作中指定render layout: false来阻止加载render layout: false我想用ajax html做出响应。