我正在学习渐进增强 http://en.wikipedia.org/wiki/Progressive_enhancement我有一个关于 AJAX 化视图的问题。在我的 MVC 3 项目中,我有一个布局页面、一个视图启动页面和两个普通视图。
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()
在控制器中,我可以返回View()
或返回PartialView()
根据请求是否是 Ajax 请求。我无法将常规视图返回到 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 则明确包含布局要容易得多。