最佳答案
我正在学习关于 渐进增强和我有一个关于 AJAXify 的观点的问题。在我的 MVC 3项目中,我有一个布局页面,一个视图开始页面和两个普通视图。
Viewstart 页面位于 View 文件夹的根目录中,因此适用于所有视图。它指定所有视图的布局页面都应该使用 _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 请求,因为那样它将使用布局页面,并且我将获得注入的布局页面的第二个副本。但是,我不喜欢这样,因为它强迫我为标准 GET 请求创建只包含 @{Html.RenderPartial();}
的空视图。
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
然后在 Index.cshtml 中执行以下操作:
@{Html.RenderPartial("partialView");}
2)当请求不是 Ajax 时,我可以从 _ viewstart 中移除布局指定并手动指定:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
有人有更好的建议吗?有没有办法返回没有布局页面的视图?如果它是一个 ajax 请求,那么明确地说“不要包含你的布局”要比明确地包含不是 ajax 的布局要容易得多。