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


71

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

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

有没有更好的方法可以做到这一点-迫使他们删除此方法-还是“隐藏”在其他地方?

感谢您对在哪里找到它或该怎么做的任何建议!


1
据我所知,它仍然存在。这是System.Web.Mvcclass中的扩展方法AjaxRequestExtensions。那是针对MVC5的,我不知道MVC6 ...
PatrykĆwiek2015年

5
这就是OP询问的内容:MVC6。当然,它仍然在MVC5中存在。
克里斯·普拉特

1
@PatrykĆwiek好的,是的,我正在测试MVC6。我当然可能错了,但“ Microsoft.AspNet.Mvc”:“ 6.0.0-beta3”程序包或新的mvc-6附带的任何其他标准mvc-6程序包似乎都缺少该程序项目。
mikal 2015年

对此不确定,但请尝试::IsAjaxRequest()不带Request.前缀。
克里斯·普拉特

对于此问题的临时解决方案,我决定从System.Web.Mvc.AjaxRequestExtensions复制并修改该方法。希望它能帮助其他人,直到找到通往框架的途径。公共静态类AjaxRequestExtensions {公共静态布尔IsAjaxRequest(此HttpRequest请求){if(request == null){throw new ArgumentNullException(“ request”); }返回request.Headers!= null && request.Headers [“ X-Requested-With”] ==“ XMLHttpRequest”; }
麦加(Mikal)2015年

Answers:


109

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

Ajax在MVC6 github存储库中进行搜索不会给出任何相关结果,但是您可以自己添加扩展名。从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;
}

由于MVC6Controller似乎正在使用Microsoft.AspNet.Http.HttpRequest,因此您必须通过对MVC5版本进行一些调整来检查request.Headers集合中的适当标头:

/// <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"


28

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

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

2
命名空间是Context什么?
Muflix

2
@Aligned不,在获取规范中没有关于在请求标头中添加标识符的任何内容。X-Requested-With也不在XMLHttpRequest规范中(因此前缀为“ X-”),但是所有供应商都将其添加为约定。没有迹象表明将对获取进行任何约定。如果您的系统需要知道,那么在创建获取请求时需要手动添加标头
Robert Slaney

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");

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;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.