【发布时间】:2011-07-16 03:49:31
【问题描述】:
我正在学习Progressive Enhancement,并且我对 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 请求,因为那样它将使用布局页面,并且我会得到第二个注入的布局页面副本。但是,我不喜欢这样,因为它迫使我为标准 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。
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-3 master-pages razor