IsAjaxRequest() 的两种实现

创建时间:
2018-09-05 10:35
最近更新:
2018-09-05 10:35

Note

  • 原生实现在 System.Web.Mvc.AjaxRequestExtensions 类中,详见本文下方源码。
  • Tony 的实现为 Tl.Request.IsAjaxRequest(),详见 TonyLibrary 项目源码。

对 原生实现 的疑虑

原生实现 System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest() 的源码 显示,该方法 依赖于 客户端代码 发出的 AJAX 请求 都有 键为 "X-Requested-With" 且 值为 "XMLHttpRequest" 的请求头。
如果没有 则 该方法中的逻辑不成立。
因此 Tony 实现了 Tl.Request.IsAjaxRequest()

TLibrary.js 中的相关代码

$.ajaxSetup({
    ...
    headers: {IsAjaxRequest: "T"},
    ...
});

Code Snippet - 调用示例

public ActionResult Delete(ulong id)
{
    ...
    bool isAjax0 = Tl.Request.IsAjaxRequest();
    bool isAjax1 = Request.IsAjaxRequest();
    ...
}

Source Code of System.Web.Mvc.AjaxRequestExtensions from JetBrains dotPeek 1.0 at 2018-09-05

Complete Copy:

// Type: System.Web.Mvc.AjaxRequestExtensions
// Assembly: System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_4.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll

using System;
using System.Web;

namespace System.Web.Mvc
{
  public static class AjaxRequestExtensions
  {
    public static bool IsAjaxRequest(this HttpRequestBase request)
    {
      if (request == null)
        throw new ArgumentNullException("request");
      if (request["X-Requested-With"] == "XMLHttpRequest")
        return true;
      if (request.Headers != null)
        return request.Headers["X-Requested-With"] == "XMLHttpRequest";
      else
        return false;
    }
  }
}