代码之家  ›  专栏  ›  技术社区  ›  jgauffin

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

  •  2
  • jgauffin  · 技术社区  · 14 年前

    我正试图弄清楚当通过ajax发出请求时,如何将视图自动呈现为部分(没有母版页)。

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

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

    我的第一个想法是在 View 方法。但是view方法返回 查看 (其中 PartialView 不要继承)。所以失败了。

    我的下一个尝试是尝试签入我的自定义razor视图引擎,如果是ajax请求,则简单地删除母版页。但那也失败了。

    我能做的就是创造一个新的方法 ViewOrPartial 它包含检查并相应地返回结果。

    你会怎么做?

    4 回复  |  直到 14 年前
        1
  •  8
  •   Darin Dimitrov    14 年前

    不如放以下几句:

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

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

    return View(model);
    

    所有razor视图都使用 _ViewStart.cshtml . 这是指定母版页的位置。因此,通过进行此更改,只有在请求不是AJAX请求时,所有视图才会有条件地自动应用母版页。相当干燥。

        2
  •  0
  •   Community CDub    8 年前
        4
  •  0
  •   iCollect.it Ltd    11 年前

    我在实践中发现 IsAjaxRequest 不是100%可靠的。

    当移动设备发出大量请求时,它偶尔会返回 false 在Ajax调用中。

    最后,我向Ajax请求添加了一个查询字符串参数(例如partial=1),以确保控制器不会被愚弄。这是在MVC4左右,所以可能从那时起就被纠正了,但我不能冒险。

    在基本控制器(由所有控制器继承)中,我添加了以下内容:

    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%可靠了。