【问题标题】:Automatically render a partial when the request is sent through ajax通过ajax发送请求时自动渲染部分
【发布时间】:2010-11-26 08:34:01
【问题描述】:

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

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

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

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

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

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

你是怎么做到的?

【问题讨论】:

  • 请注意:在一个有大量Ajax请求的项目中,我随机收到来自移动浏览器的Ajax请求,其中Request.IsAjaxRequest()返回false!!!为了安全起见,我必须在我的请求中添加一个查询字符串参数(如partial=1)。如果没有它,它有时会将整个页面呈现为子元素。

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


【解决方案1】:

以下内容如何:

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

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

return View(model);

所有剃刀视图都使用_ViewStart.cshtml。这是指定母版页的地方。因此,通过进行此更改,所有视图将仅在请求不是 AJAX 请求时有条件地应用母版页。很干。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我试过了,但 IsAjaxRequest() 在视图引擎中总是错误的。我不知道为什么。
    • 在你的答案中包含一个摘要。
    【解决方案3】:

    【讨论】:

    • 你还没有理解我的问题。我正在使用 jquery 将类名中带有“ajax”的所有链接转换为 ajax 请求。那部分工作正常。 ajax 请求正在调用该操作。我不想在所有可以正常调用或通过 ajax 调用的操作中使用 return Request.IsAjaxRequest() ? PartialView(model) : View(model) 之类的东西。
    【解决方案4】:

    我在实践中发现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% 可靠的。

    【讨论】:

      猜你喜欢
      • 2022-08-19
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2014-09-18
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多