【发布时间】:2010-01-18 15:24:54
【问题描述】:
如何在asp.net mvc中使用ajax检测页面何时被调用?
【问题讨论】:
标签: jquery asp.net-mvc ajax
如何在asp.net mvc中使用ajax检测页面何时被调用?
【问题讨论】:
标签: jquery asp.net-mvc ajax
根据 Professional ASP.NET MVC 1.0 book,MVC AJAX 库将插入一个名为“X-Requested-With”的表单字段,其值为“XMLHttpRequest”。
然后您可以在 System.Web.Mvc 中使用扩展方法,这意味着您可以简单地调用 Request.IsAjaxRequest() 并获得一个简单的真假判断这是一个 AJAX 请求。
【讨论】:
Request.IsAjaxRequest()返回false!!!为了安全起见,我必须在请求中添加一个查询字符串参数(如partial=1)。
您可以像这样手动检查它:
bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";
或者,当您在 ASP.NET MVC 中的控制器中,它引用 System.Web.Mvc 您将在 HttpRequestBase 对象上获得一个 extension-method,您可以在其中访问像这样的 ActionMethod:
bool isAjaxRequest = Request.IsAjaxRequest();
【讨论】:
Request.IsAjaxRequest()返回false!!!为了安全起见,我必须在请求中添加一个查询字符串参数(如partial=1)。
没有特定的方法来确定调用是由 javascript 还是直接在浏览器中进行,因为它是一个常规的 http 调用。
您可以在 ajax 调用中添加标头以将其与其他调用区分开来,或者可以在查询字符串中添加仅用于 ajax 调用的参数。
ASP.NET MVC ajax 确实添加了这样一个标头 - X-Requested-With: XMLHttpRequest,您可以使用它来嗅探这是 mvc ajax 库的 ajax 调用。但是,如果您使用 jQuery 或您自己的手动 ajax 调用,则不会设置此项。此外,其他客户端可能会欺骗此标头(例如,使用 WebClient),因此发现它并不能保证已经进行了 ajax 调用。
【讨论】:
Request.IsAjaxRequest() 返回 false !!!为了安全起见,我必须在请求中添加一个查询字符串参数(如partial=1)。
检查请求是否为 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 调用中传递一些参数 - AJAX 只是一个 GET 请求,与在地址栏中输入 url 并按 Enter 没有什么不同(这就是为什么 AJAX 必须防止跨站点脚本攻击,否则攻击者可以通过在图片中包含 url 来强制人们对您的站点执行 AJAX 命令)
【讨论】:
为什么重要?它不应该。您真的要进行内容协商吗?
【讨论】:
Serving up different content just because the request originated from a different type of client is bad design 客户端是一样的,只是获取请求的方式不同。