mikal
mikal

Reputation: 1345

Where is Request.IsAjaxRequest() in Asp.Net Core MVC?

To learn more about the new exciting Asp.Net-5 framework, I'm trying to build a web application using the newly released Visual Studio 2015 CTP-6.

Most things looks really promising, but I can't seem to find Request.IsAjaxRequest() - a functionality I've been using quite frequently on older MVC projects.

Is there a better way to do this - that made them remove this method - or is it "hidden" somewhere else?

Thanks for any advice on where to find it or what to do instead!

Upvotes: 91

Views: 52262

Answers (5)

The Benetrator
The Benetrator

Reputation: 367

Combining the top 2 answers, this is what worked for me

_ViewStart.cshtml (Entire Contents):

@{
    bool isAjaxCall = Context.Request.Headers["x-requested-with"] == "XMLHttpRequest";
    
    Layout = isAjaxCall ? null : "_YourLayoutName";
}

Upvotes: 1

guhyeon
guhyeon

Reputation: 595

in asp.net core, You can use Context.Request.Headers.

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

Upvotes: 42

Spazmoose
Spazmoose

Reputation: 304

After using the solution provided above by Patryk Ćwiek above I noticed a potential issue (largely due to my incorrectly typing "XMLHttpRequest" as "XmlHttpRequest"), which resulted in an incorrect return value. To accommodate my mistake, I updated it slightly. Here's my updated version:

    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;
    }

Upvotes: 4

Patryk Ćwiek
Patryk Ćwiek

Reputation: 14328

I got a little confused, because the title mentioned MVC 5.

Search for Ajax in the MVC6 github repo doesn't give any relevant results, but you can add the extension yourself. Decompilation from MVC5 project gives pretty straightforward piece of code:

/// <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;
}

Since MVC6 Controller seems to be using Microsoft.AspNet.Http.HttpRequest, you'd have to check request.Headers collection for appropriate header by introducing few adjustments to MVC5 version:

/// <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;
}

or directly:

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

Upvotes: 132

Ch Bhargav
Ch Bhargav

Reputation: 111

For those who are working on ASP.Net Core

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

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

Upvotes: 11

Related Questions