我正在学习渐进增强功能,并且对AJAXifying视图有疑问。在我的MVC 3项目中,我有一个布局页面,一个viewstart页面和两个纯视图。
viewstart页面位于Views文件夹的根目录中,因此适用于所有视图。它指定所有视图均_Layout.cshtml
应用于其布局页面。布局页面包含两个导航链接,每个视图一个。链接用于@Html.ActionLink()
将自身呈现到页面。
现在,我添加了jQuery,并希望劫持这些链接,并使用Ajax在页面上动态加载其内容。
<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)我可以获取整个View的内容并将它们放在局部视图中,然后在渲染时让主视图调用局部视图。这样Request.IsAjaxRequest()
,我就可以在控制器中使用,根据请求是否为Ajax请求来返回View()
或返回PartialView()
。我无法将常规视图返回到Ajax请求,因为那样它将使用布局页面,并且我将获得注入的布局页面的第二个副本。但是,我不喜欢这样,因为它迫使我创建一个空视图,其中只包含一个@{Html.RenderPartial();}
用于标准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.
}
有谁有更好的建议?有没有办法返回没有布局页面的视图?如果是ajax请求,则明确地说“不包括布局”要容易得多,如果不是ajax,则要显式地包括布局要容易得多。