【问题标题】:asp.net mvc: how to detect when a page is called using ajaxasp.net mvc:如何检测何时使用 ajax 调用页面
【发布时间】:2010-01-18 15:24:54
【问题描述】:

如何在asp.net mvc中使用ajax检测页面何时被调用?

【问题讨论】:

    标签: jquery asp.net-mvc ajax


    【解决方案1】:

    根据 Professional ASP.NET MVC 1.0 book,MVC AJAX 库将插入一个名为“X-Requested-With”的表单字段,其值为“XMLHttpRequest”。

    然后您可以在 System.Web.Mvc 中使用扩展方法,这意味着您可以简单地调用 Request.IsAjaxRequest() 并获得一个简单的真假判断这是一个 AJAX 请求。

    【讨论】:

    • 虽然这在大多数情况下都是可靠的,但我认为提问者应该意识到这可以很容易被欺骗。
    • 请注意:在一个有大量请求的项目中,我随机收到来自移动浏览器的Ajax请求,其中Request.IsAjaxRequest()返回false!!!为了安全起见,我必须在请求中添加一个查询字符串参数(如partial=1)。
    【解决方案2】:

    您可以像这样手动检查它:

    bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";
    

    或者,当您在 ASP.NET MVC 中的控制器中,它引用 System.Web.Mvc 您将在 HttpRequestBase 对象上获得一个 extension-method,您可以在其中访问像这样的 ActionMethod:

    bool isAjaxRequest = Request.IsAjaxRequest();
    

    【讨论】:

    • 请注意:在一个有大量请求的项目中,我随机收到来自移动浏览器的Ajax请求,其中Request.IsAjaxRequest()返回false!!!为了安全起见,我必须在请求中添加一个查询字符串参数(如partial=1)。
    【解决方案3】:

    没有特定的方法来确定调用是由 javascript 还是直接在浏览器中进行,因为它是一个常规的 http 调用。

    您可以在 ajax 调用中添加标头以将其与其他调用区分开来,或者可以在查询字符串中添加仅用于 ajax 调用的参数。

    ASP.NET MVC ajax 确实添加了这样一个标头 - X-Requested-With: XMLHttpRequest,您可以使用它来嗅探这是 mvc ajax 库的 ajax 调用。但是,如果您使用 jQuery 或您自己的手动 ajax 调用,则不会设置此项。此外,其他客户端可能会欺骗此标头(例如,使用 WebClient),因此发现它并不能保证已经进行了 ajax 调用。

    【讨论】:

    • +1 用于在一个有大量请求的项目上建议一个参数,我随机收到来自移动浏览器的 Ajax 请求,其中 Request.IsAjaxRequest() 返回 false !!!为了安全起见,我必须在请求中添加一个查询字符串参数(如partial=1)。
    【解决方案4】:

    检查请求是否为 ajax 请求的最佳方法是检查 Request.IsAjaxRequest()。很高兴知道,在底层,MVC 框架会检查请求参数或请求标头中的 ajax 请求。 ASP.Net MVC源码中的代码是:

        public static bool IsAjaxRequest(this HttpRequestBase request) {
            if (request == null) {
                throw new ArgumentNullException("request");
            }
    
            return (request["X-Requested-With"] == "XMLHttpRequest") || ((request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest"));
        }
    

    所以如果你想手动检查(不推荐)你必须同时检查。

    【讨论】:

      【解决方案5】:

      您需要在 AJAX 调用中传递一些参数 - AJAX 只是一个 GET 请求,与在地址栏中输入 url 并按 Enter 没有什么不同(这就是为什么 AJAX 必须防止跨站点脚本攻击,否则攻击者可以通过在图片中包含 url 来强制人们对您的站点执行 AJAX 命令)

      【讨论】:

        【解决方案6】:

        为什么重要?它不应该。您真的要进行内容协商吗?

        【讨论】:

        • 这很重要。例如,您可能不想返回一个完整的 HTML 页面,而只想返回一个部分。
        • 然后在url中添加一个参数。仅仅因为请求来自不同类型的客户端而提供不同的内容是糟糕的设计。此方法为 ajax 请求锁定该行为。如果您以后想通过 ajax 获取整个页面内容怎么办(哎呀,不能)。如果您稍后编写需要部分内容的桌面应用程序怎么办(糟糕,也不能这样做,因为它不是 ajax 请求)。
        • 你是认真的吗?为什么你会想要通过 ajax 获取一个完整的 html 页面?与使用普通请求相比,没有什么好处。写一个想要部分内容的桌面客户端?你正在为自己构建一个网络浏览器吗? ;) Serving up different content just because the request originated from a different type of client is bad design 客户端是一样的,只是获取请求的方式不同。
        • 可能该页面不是当前正在显示的页面(例如 jQuery 线索提示插件)。也许我正在构建下一个 twitter,并且我想支持多个客户端,而不仅仅是浏览器。我想要不需要一次性获取整个页面的原生 iPhone 和 Andriod 应用程序。而且我当然不想每次发现另一个我想进入的平台时都重新编码网站。
        • 而 XMLHttpRequest 是一个单独的客户端,具有不同的功能。它会解析html并渲染它吗?它会在 html 响应中请求 css、js 和图像文件吗?和浏览器本身不一样。
        猜你喜欢
        • 2013-10-06
        • 2015-12-24
        • 2020-04-22
        • 2010-11-11
        • 2011-03-27
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多