Jquery asp.NETMVC:如何检测何时使用ajax调用页面

Jquery asp.NETMVC:如何检测何时使用ajax调用页面,jquery,asp.net-mvc,ajax,Jquery,Asp.net Mvc,Ajax,如何在asp.net mvc中检测何时使用ajax调用页面?没有特定的方法确定调用是通过javascript还是直接在浏览器中进行的,因为这是一个常规http调用 您可以向ajax调用添加一个头以区别于其他调用,也可以向查询字符串中添加一个仅用于ajax调用的参数 ASP.NET MVC ajax确实添加了这样一个标题-X-request-With:XMLHttpRequest,您可以使用它来嗅探这是MVC ajax库的ajax调用。但是,如果您使用jQuery或自己的手动ajax调用,则不会设

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

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

您可以向ajax调用添加一个头以区别于其他调用,也可以向查询字符串中添加一个仅用于ajax调用的参数


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

您需要在ajax调用中传递一些参数-ajax只是一个GET请求,与在地址栏中键入url并按enter键没有什么不同(这就是为什么AJAX必须防范跨站点脚本攻击的原因,否则攻击者只需在图像中包含url,就可以强迫用户对您的站点执行AJAX命令)

根据专业的ASP.NET MVC 1.0书籍,MVC AJAX库将插入一个名为“X-request-With”的表单字段,其值为“XMLHttpRequest”


然后,您可以在System.Web.Mvc中使用扩展方法,这意味着您可以简单地调用
Request.IsAjaxRequest()
,并得到一个简单的正确或错误,说明这是一个AJAX请求。

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

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

bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";
bool isAjaxRequest = Request.IsAjaxRequest();
或者,当您在ASP.NET MVC中的控制器中时,该控制器引用了System.Web.MVC,您将在对象上获得一个链接,您可以在ActionMethod中访问该链接,如下所示:

bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";
bool isAjaxRequest = Request.IsAjaxRequest();

检查请求是否为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"));
    }

因此,如果你想手动检查它(不建议这样做),你必须同时检查两者。

虽然这在大多数情况下是可靠的,但我认为询问者应该意识到这很容易被欺骗。请注意:在一个有大量请求的项目中,我随机从移动浏览器获得了Ajax请求,这些浏览器具有
request.IsAjaxRequest()
返回false!!!我必须添加一个querystring参数(比如
partial=1
)为了我的请求安全起见。这很重要。例如,您可能不想返回完整的HTML页面,而只想返回部分页面。然后向url添加一个参数。仅仅因为请求来自不同类型的客户端而提供不同的内容是一种糟糕的设计。此方法将ajax请求的行为锁定。如果你以后想通过ajax获取整个页面内容(Oops,不能)。如果你以后编写的桌面应用程序需要部分内容(Oops,也不能这样做,因为它不是ajax请求),该怎么办。你是认真的吗?你为什么要通过ajax获取完整的html页面?与使用普通请求相比,没有什么好处。编写一个桌面客户端来获取html的部分内容?你是在构建一个web浏览器吗?;)
仅仅因为来自不同类型客户端的请求就提供不同的内容是糟糕的设计
客户端是相同的,只是请求的获取方式不同。可能页面不是当前显示的页面(例如jQuery clueTip插件)。也许我正在构建下一个twitter,我想支持多个客户端,而不仅仅是浏览器。我想要本机iPhone和Andriod应用程序,它们不必一次就获取整个页面。当然,我不想每次发现另一个我想使用的平台时都对站点重新编码。XMLHttpRequest是一个独立的客户端,具有独立的功能。它会解析html并呈现它吗?它会在html响应中请求css、js和图像文件吗?与浏览器本身不一样。+1对于建议一个参数,就像在一个有大量请求的项目上一样,我从移动浏览器中随机获得了Ajax请求,其中
Request.IsAjaxRequest()
返回false!!!为了安全起见,我不得不在请求中添加一个querystring参数(比如
partial=1
)。请注意:在一个有大量请求的项目中,我从移动浏览器随机获得了Ajax请求,这些浏览器有
request.IsAjaxRequest()
返回false!!!为了安全起见,我不得不在请求中添加一个querystring参数(比如
partial=1
)。