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

Posted

技术标签:

【中文标题】Asp.Net Core MVC 中的 Request.IsAjaxRequest() 在哪里?【英文标题】:Where is Request.IsAjaxRequest() in Asp.Net Core MVC? 【发布时间】:2015-03-26 15:15:13 【问题描述】:

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

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

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

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

【问题讨论】:

据我所知,它还在那里。它是System.Web.MvcAjaxRequestExtensions 中的扩展方法。那是给MVC5的,我不知道MVC6... 这就是 OP 所要求的:MVC6。当然,它仍然存在于 MVC5 中。 @PatrykĆwiek 好的,是的,我正在测试 MVC6。我当然可能是错的,但它似乎从 "Microsoft.AspNet.Mvc": "6.0.0-beta3" 包中丢失 - 或任何其他标准 mvc-6 包中都带有新的 mvc-6项目。 对此不确定,但请尝试:IsAjaxRequest(),不带 Request. 前缀。 为了临时解决这个问题,我决定复制并修改 System.Web.Mvc.AjaxRequestExtensions 中的方法。希望它可以帮助其他人,直到找到它进入框架的方式。 public static class AjaxRequestExtensions public static bool IsAjaxRequest(this HttpRequest request) if (request == null) throw new ArgumentNullException("request"); return request.Headers != null && request.Headers["X-Requested-With"] == "XMLHttpRequest"; 【参考方案1】:

我有点困惑,因为标题提到了 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(nameof(request));

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

或直接:

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

【讨论】:

MVC5版本的源码在这里:github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/…【参考方案2】:

在asp.net core中,可以使用Context.Request.Headers。

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

【讨论】:

Context 的命名空间是什么? @Aligned 不,获取规范中没有关于在请求标头中添加标识符的内容。 X-Requested-With 也不在 XMLHttpRequest 规范中(因此是“X-”前缀),但所有供应商都将其添加为约定。没有迹象表明任何约定将用于获取。如果您的系统需要知道,那么您需要在创建获取请求时手动添加标头【参考方案3】:

对于那些正在使用 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");

【讨论】:

【参考方案4】:

在使用上述 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;
    

【讨论】:

以上是关于Asp.Net Core MVC 中的 Request.IsAjaxRequest() 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core MVC 中的 IViewLocationExpander.PopulateValues() 是啥

我想更改 ASP.NET Core 5 MVC 中的路径

[十] ASP.NET Core MVC 中的路由

数据存储到 ASP.NET Core 5 MVC 中的关联表

EF Core 中的 ASP.NET Core 5 MVC 和 Identity - 基于资源的授权

等效于 ASP.NET Core MVC 中的“@section”?