我正在学习渐进增强,对于使用AJAX化视图有些疑问。在我的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)我可以将整个视图的内容放在一个部分视图中,然后在主视图呈现时调用该部分视图。通过在控制器中使用Request.IsAjaxRequest()
,我可以根据请求是否为Ajax请求返回View()
或PartialView()
。我不能将常规视图返回给Ajax请求,因为那样会使用布局页面,并且会注入第二个复制的布局页面。但是,我不喜欢这个方法,因为它强制我创建空视图,只有一个@{Html.RenderPartial();}
。
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请求,则明确地包括布局会更容易。