关于c#:MVC 3:当通过ajax加载时,如何在没有布局页面的情况下呈现视图?

MVC 3: How to render a view without its layout page when loaded via ajax?

我正在学习渐进式增强,我有一个关于半开化观点的问题。在我的MVC 3项目中,我有一个布局页面、一个视图开始页面和两个普通视图。

VIEWStart页位于VIEWS文件夹的根目录中,因此适用于所有视图。它指定所有视图的布局页都应使用_Layout.cshtml。布局页面包含两个导航链接,每个视图一个。链接使用@Html.ActionLink()呈现到页面。

现在我已经添加了jquery,并希望劫持这些链接,并使用Ajax动态地将它们的内容加载到页面上。

1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
    $(function () {
        $('#theLink').click(function () {
            $.ajax({
                url: $(this).attr('href'),
                type:"GET",
                success: function (response) {
                    $('#mainContent').html(response);
                }
            });
            return false;
        });
    });

我有两种方法可以做到这一点,但我不特别喜欢这两种方法:

1)我可以获取整个视图的内容并将它们放在局部视图中,然后让主视图在呈现时调用局部视图。这样,使用控制器中的Request.IsAjaxRequest(),我可以根据请求是否为Ajax请求返回View()或返回PartialView()。我无法将常规视图返回到Ajax请求,因为这样它将使用布局页,并且将获得注入布局页的第二个副本。但是,我不喜欢这样,因为它强制我创建空视图,其中只有一个用于标准GET请求的@{Html.RenderPartial();}

1
2
3
4
5
6
7
    public ActionResult Index()
    {
        if (Request.IsAjaxRequest())
            return PartialView("partialView");
        else
            return View();
    }

然后在index.cshtml中执行以下操作:

1
@{Html.RenderPartial("partialView");}

2)当请求不是Ajax时,我可以从u viewstart中删除布局名称并手动指定:

1
2
3
4
5
6
7
    public ActionResult Index()
    {
        if (Request.IsAjaxRequest())
            return View(); // Return view with no master.
        else
            return View("Index","_Layout"); // Return view with master.
    }

有人有更好的建议吗?是否有返回不带布局页的视图的方法?如果它是Ajax请求,那么显式地说"不包括您的布局"要比显式地包括非Ajax的布局容易得多。


~/Views/ViewStart.cshtml中:

1
2
3
@{
    Layout = Request.IsAjaxRequest() ? null :"~/Views/Shared/_Layout.cshtml";
}

在控制器中:

1
2
3
4
public ActionResult Index()
{
    return View();
}


把下面的代码放在页面的顶部

1
2
3
@{
    Layout ="";
}


创建两个布局:1。空布局,2.主布局,然后写在viewstart文件中此代码:

1
2
3
4
5
6
7
8
9
@{
if (Request.IsAjaxRequest())
{
    Layout ="~/Areas/Dashboard/Views/Shared/_emptyLayout.cshtml";
}
else
{
    Layout ="~/Areas/Dashboard/Views/Shared/_Layout.cshtml";
}}

当然,也许这不是最好的解决办法


我更喜欢和使用你的1选项。我不喜欢2,因为对我来说,View()意味着你要返回一整页。一旦视图引擎使用完它,它就应该是一个完整、有效的HTML页面。创建PartialView()是为了返回任意的HTML块。

我不认为有一个仅仅称之为局部的观点是什么大不了的。它仍然是干燥的,并且允许您在两个场景中使用分部的逻辑。

许多人不喜欢用Request.IsAjaxRequest()分割他们行动的调用路径,我可以理解。但是,在我看来,如果你所做的只是决定是叫View()还是PartialView(),那么这个分支就不是什么大问题,而且很容易维护(和测试)。如果您发现自己使用IsAjaxRequest()来确定大部分操作的执行方式,那么单独执行Ajax操作可能更好。


您不必为此创建空视图。

在控制器中:

1
2
3
4
if (Request.IsAjaxRequest())
  return PartialView();
else
  return View();

返回partialView结果将在呈现响应时重写布局定义。


对于RubyonRails应用程序,我可以通过指定我想用Ajax HTML响应的控制器操作中的render layout: false