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!
System.Web.Mvc
KlasseAjaxRequestExtensions
. Das ist für MVC5, ich weiß nicht über MVC6 ...IsAjaxRequest()
, ohne dasRequest.
Präfix.Antworten:
Ich war etwas verwirrt, weil der Titel MVC 5 erwähnte.
Die Suche
Ajax
im 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 MVC6
Controller
anscheinend Microsoft.AspNet.Http.HttpRequest verwendet , müssen Sie dierequest.Headers
Sammlung 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"
quelle
Im asp.net-Kern können Sie Context.Request.Headers verwenden.
bool isAjaxCall = Context.Request.Headers["x-requested-with"]=="XMLHttpRequest"
quelle
Context
?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");
quelle
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; }
quelle