Wo befindet sich Request.IsAjaxRequest () in Asp.Net Core MVC?

71

Um mehr über das neue aufregende Asp.Net-5-Framework zu erfahren, versuche ich, eine Webanwendung mit dem neu veröffentlichten Visual Studio 2015 CTP-6 zu erstellen.

Die meisten Dinge sehen wirklich vielversprechend aus, aber ich kann Request.IsAjaxRequest () anscheinend nicht finden - eine Funktion, die ich in älteren MVC-Projekten ziemlich häufig verwendet habe.

Gibt es einen besseren Weg, dies zu tun - das hat sie dazu gebracht, diese Methode zu entfernen - oder ist sie woanders "versteckt"?

Vielen Dank für Ratschläge, wo Sie es finden oder was Sie stattdessen tun sollten!

mikal
quelle
1
Soweit ich das beurteilen kann, ist es immer noch da. Es ist eine Erweiterungsmethode in der System.Web.MvcKlasse AjaxRequestExtensions. Das ist für MVC5, ich weiß nicht über MVC6 ...
Patryk Ćwiek
5
Darum bittet das OP: MVC6. Natürlich ist es in MVC5 immer noch da.
Chris Pratt
1
@ PatrykĆwiek Ok, ja, ich teste MVC6. Ich könnte mich natürlich irren, aber es scheint im "Microsoft.AspNet.Mvc": "6.0.0-beta3" -Paket zu fehlen - oder in einem der anderen Standard-MVC-6-Pakete, die mit einem neuen MVC-6 geliefert werden Projekt.
Mikal
Ich bin mir nicht sicher, aber versuche es einfach : IsAjaxRequest(), ohne das Request.Präfix.
Chris Pratt
Für eine vorübergehende Lösung habe ich beschlossen, die Methode von System.Web.Mvc.AjaxRequestExtensions zu kopieren und zu ändern. Hoffe es hilft anderen, bis dies den Weg zum Framework findet. öffentliche statische Klasse AjaxRequestExtensions {public static bool IsAjaxRequest (diese HttpRequest-Anforderung) {if (request == null) {neue ArgumentNullException ("request") auslösen; } return request.Headers! = null && request.Headers ["X-Requested-With"] == "XMLHttpRequest"; }}
Mikal

Antworten:

109

Ich war etwas verwirrt, weil der Titel MVC 5 erwähnte.

Die Suche Ajaxim MVC6-Github-Repo liefert keine relevanten Ergebnisse , aber Sie können die Erweiterung selbst hinzufügen. Die Dekompilierung aus dem MVC5-Projekt liefert einen ziemlich einfachen 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;
}

Da MVC6Controller anscheinend Microsoft.AspNet.Http.HttpRequest verwendet , müssen Sie die request.HeadersSammlung auf den entsprechenden Header überprüfen, indem Sie einige Anpassungen an der MVC5-Version vornehmen:

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

oder direkt:

var isAjax = request.Headers["X-Requested-With"] == "XMLHttpRequest"
Patryk Ćwiek
quelle
Der Quellcode aus der Version von MVC5 ist hier: github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/…
Fred
28

Im asp.net-Kern können Sie Context.Request.Headers verwenden.

bool isAjaxCall = Context.Request.Headers["x-requested-with"]=="XMLHttpRequest"
Guhyeon
quelle
2
Wofür ist der Namespace Context?
Muflix
2
@Aligned Nein, in der Abrufspezifikation ist nichts über das Hinzufügen eines Bezeichners in den Anforderungsheadern enthalten. Das X-Requested-With ist auch nicht in der XMLHttpRequest-Spezifikation enthalten (daher das Präfix "X-"), aber alle Anbieter haben es als Konvention hinzugefügt. Es gibt keinen Hinweis darauf, dass eine Konvention zum Abrufen durchgeführt wird. Wenn Ihr System wissen muss, müssen Sie beim Erstellen Ihrer Abrufanforderung manuell einen Header hinzufügen
Robert Slaney
3

Für diejenigen, die an ASP.Net Core arbeiten

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

Beispiel
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");
Cherupally Bhargav
quelle
0

Nachdem ich die oben von Patryk Ćwiek oben bereitgestellte Lösung verwendet hatte, bemerkte ich ein potenzielles Problem (hauptsächlich aufgrund meiner falschen Eingabe von "XMLHttpRequest" als "XmlHttpRequest"), das zu einem falschen Rückgabewert führte. Um meinem Fehler Rechnung zu tragen, habe ich ihn leicht aktualisiert. Hier ist meine aktualisierte 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;
    }
Spazmoose
quelle