Asp.Net Core MVC中的Request.IsAjaxRequest()在哪里?

时间:2015-03-26 15:15:14

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc

要了解有关新的令人兴奋的Asp.Net-5框架的更多信息,我正在尝试使用新发布的Visual Studio 2015 CTP-6构建Web应用程序。

大多数事情看起来很有希望,但我似乎无法找到Request.IsAjaxRequest() - 我在旧的MVC项目中经常使用的功能。

有没有更好的方法来做到这一点 - 这会让他们删除这个方法 - 还是“隐藏”在其他地方?

感谢您提供有关在哪里找到它或做什么的建议!

4 个答案:

答案 0 :(得分:85)

我有点困惑,因为标题提到了MVC 5.

搜索Ajax in the MVC6 github repo doesn't give any relevant results,但您可以自行添加扩展程序。从MVC5项目中反编译可以提供非常简单的代码:

/// <summary>
/// Determines whether the specified HTTP request is an AJAX request.
/// </summary>
/// 
/// <returns>
/// true if the specified HTTP request is an AJAX request; otherwise, false.
/// </returns>
/// <param name="request">The HTTP request.</param><exception cref="T:System.ArgumentNullException">The <paramref name="request"/> parameter is null (Nothing in Visual Basic).</exception>
public static bool IsAjaxRequest(this HttpRequestBase request)
{
  if (request == null)
    throw new ArgumentNullException(nameof(request));
  if (request["X-Requested-With"] == "XMLHttpRequest")
    return true;
  if (request.Headers != null)
    return request.Headers["X-Requested-With"] == "XMLHttpRequest";
  return false;
}

由于MVC6 Controller似乎正在使用Microsoft.AspNet.Http.HttpRequest,您必须通过对MVC5版本进行一些调整来检查request.Headers collection是否有合适的标头:

/// <summary>
/// Determines whether the specified HTTP request is an AJAX request.
/// </summary>
/// 
/// <returns>
/// true if the specified HTTP request is an AJAX request; otherwise, false.
/// </returns>
/// <param name="request">The HTTP request.</param><exception cref="T:System.ArgumentNullException">The <paramref name="request"/> parameter is null (Nothing in Visual Basic).</exception>
public static bool IsAjaxRequest(this HttpRequest request)
{
  if (request == null)
    throw new ArgumentNullException("request");

  if (request.Headers != null)
    return request.Headers["X-Requested-With"] == "XMLHttpRequest";
  return false;
}

或直接:

var isAjax = request.Headers["X-Requested-With"] == "XMLHttpRequest"

答案 1 :(得分:15)

在asp.net核心中,您可以使用Context.Request.Headers。

bool isAjaxCall = Context.Request.Headers["x-requested-with"]=="XMLHttpRequest"

答案 2 :(得分:0)

对于那些正在使用ASP.Net Core的人

HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest";

示例
Controller.cs

bool isAjax = HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest";

if (isAjax)
   return Json(new { redirectTo = Url.Action("Index", "ControllerAction") });
else
   return RedirectToAction("Index", "ControllerAction");

答案 3 :(得分:0)

在使用上面PatrykĆwiek提供的解决方案之后,我注意到了一个潜在的问题(很大程度上是由于我错误地将“ XMLHttpRequest”键入为“ XmlHttpRequest”)导致返回值不正确。为了适应我的错误,我对其进行了稍微的更新。这是我的更新版本:

    public static bool IsAjaxRequest(this HttpRequest request)
    {
        if (request == null)
            throw new ArgumentNullException(nameof(request));

        if (request.Headers != null)
            return !string.IsNullOrEmpty(request.Headers["X-Requested-With"]) &&
                string.Equals(
                    request.Headers["X-Requested-With"], 
                    "XmlHttpRequest", 
                    StringComparison.OrdinalIgnoreCase);

        return false;
    }