通过ajax发送请求时自动呈现部分

时间:2010-11-26 08:34:01

标签: asp.net-mvc ajax asp.net-mvc-3 razor partial

我试图找出当通过ajax发出请求时如何自动将视图呈现为部分(无母版页)。

我想避免的是在每个可以返回ajax的控制器方法中使用以下代码(因为那不是很干):

return Request.IsAjaxRequest() ? PartialView(model) : View(model)

我的第一个想法是在View方法中将检查添加到我的基本控制器中。但是view方法返回ViewPartialView不继承)。失败了。

我的下一次尝试是尝试在我的自定义剃刀视图引擎中进行检查,如果它是ajax请求,则简单地删除母版页。但那也失败了。

我可以做的是创建一个新方法ViewOrPartial,其中包含检查并相应地返回结果。

你会怎么做?

4 个答案:

答案 0 :(得分:8)

如何实现以下目标:

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

在您的~/Views/_ViewStart.cshtml和控制器操作中,只需返回一个视图:

return View(model);

所有剃须刀视图都使用_ViewStart.cshtml。这是指定母版页的位置。因此,通过进行此更改,如果请求不是AJAX请求,则所有视图将自动仅有条件地应用母版页。很干。

答案 1 :(得分:0)

我在这里概述了如何做到这一点: Simple ASP.NET MVC CRUD views opening/closing in JavaScript UI dialog

答案 2 :(得分:0)

答案 3 :(得分:0)

我在实践中发现IsAjaxRequest并非100%可靠。

对于来自移动设备的大量请求,它偶尔会在Ajax调用上返回false

我最后在我的Ajax请求中添加了一个查询字符串参数(例如partial = 1),以确保控制器没有被欺骗。这是围绕MVC 4,所以可能已经纠正过,但我不能冒险。

在我的基本控制器中(由我的所有控制器继承)我添加了这个:

public bool IsPartialPageRequest
{
    get
    {
        return Request.IsAjaxRequest() || !string.IsNullOrEmpty(Request["partial"]);
    }
}

在控制器中,我有类似的东西:

    if (!base.IsPartialPageRequest)
    {
        ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";
    }

最后,在我看来,我有:

@{
    Layout = ViewBag.Layout;
}

我确保我总是将&partial=1添加到我的Ajax请求中(以防万一),并且自那以后它已经100%可靠。