Wie erkennen, wenn eine Seite mit Ajax in asp.net mvc aufgerufen wird?asp.net mvc: Wie erkennt man, wenn eine Seite mit Ajax aufgerufen wird
Antwort
Nach dem Buch Professional ASP.NET MVC 1.0 fügt die MVC AJAX-Bibliothek ein Formularfeld namens "X- Requested-With "mit einem Wert von" XMLHttpRequest ".
Sie können dann eine Erweiterungsmethode in System.Web.Mvc verwenden, was bedeutet, dass Sie einfach Request.IsAjaxRequest()
anrufen können und ein einfaches wahres oder falsches Sprichwort erhalten, wenn es sich um eine AJAX-Anfrage handelt.
Es gibt keine spezielle Möglichkeit zu bestimmen, ob der Aufruf von Javascript oder direkt im Browser ausgeführt wurde, da es sich um einen normalen http-Aufruf handelt.
Sie können Ihrem AJAX-Aufruf einen Header hinzufügen, um ihn von anderen Aufrufen zu unterscheiden, oder möglicherweise einen Parameter zum Abfrage-String hinzufügen, der nur für AJAX-Aufrufe verwendet wird.
ASP.NET MVC Ajax fügt einen solchen Header - X-Requested-With: XMLHttpRequest
, die Sie verwenden können, um zu schnüffeln, dass dies ein Ajax-Aufruf von der Mvc Ajax-Bibliothek ist. Wenn Sie jQuery oder Ihre eigenen handgerollten Ajax-Aufrufe verwenden, wird dies jedoch nicht festgelegt. Darüber hinaus könnten andere Clients diesen Header fälschen (z. B. mit dem WebClient), sodass die Suche keine Garantie dafür ist, dass ein Ajax-Aufruf erfolgt ist.
+1 für das Vorschlagen eines Parameters wie bei einem Projekt mit einer großen Anzahl von Anfragen, habe ich zufällig Ajax-Anfragen von mobilen Browsern bekommen, die 'Request.IsAjaxRequest()' false zurückgegeben haben !!! Ich musste meinen Anforderungen einen Abfragezeichenfolge-Parameter hinzufügen (wie "partiell = 1"), um auf der sicheren Seite zu sein. –
Sie müssten einige Parameter mit Ihrem AJAX-Aufruf übergeben - AJAX ist nur eine GET-Anfrage, nicht anders dann eine URL in die Adresszeile eingeben und Enter drücken (aus diesem Grund muss AJAX vor Cross-Site-Scripting-Attacken geschützt werden, anderenfalls kann ein Angreifer Personen dazu zwingen, AJAX-Befehle für Ihre Site auszuführen, indem er die URL in ein Bild einfügt.)
Warum ist das wichtig? Es sollte nicht. Versuchen Sie wirklich, Content-Verhandlungen zu führen?
Es ist wichtig. Beispielsweise möchten Sie möglicherweise keine vollständige HTML-Seite, sondern nur eine unvollständige HTML-Seite zurückgeben. – jgauffin
Dann fügen Sie einen Parameter zur URL hinzu.Nur weil die Anfrage von einem anderen Client-Typ stammt, wird ein anderer Content bereitgestellt. Diese Methode sperrt dieses Verhalten für Ajax-Anfragen. Was, wenn Sie später den gesamten Seiteninhalt über Ajax erhalten wollen (Hoppla, kann nicht). Was ist, wenn Sie später eine Desktop-App schreiben, die partiellen Inhalt haben möchte (Hoppla, kann das auch nicht, da es keine Ajax-Anfrage ist). – Ryan
Meinst du das ernst? Warum solltest du jemals eine komplette HTML-Seite über Ajax holen wollen? Es gibt nichts zu gewinnen im Vergleich zu einer normalen Anfrage. Schreiben Sie einen Desktop-Client, der nur teilweise Inhalt haben soll? Bauen Sie sich einen Webbrowser? ;) 'Verschiedene Inhalte zu bedienen, nur weil die Anfrage von einer anderen Art von Client stammt, ist ein schlechtes Design. 'Der Client ist der gleiche, es ist nur, wie die Anfrage abgerufen wird, die sich unterscheiden. – jgauffin
Sie können es manuell wie folgt aus:
bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";
Oder, wenn Sie in einem Controller in ASP.NET MVC sind, die System.Web.Mvc verweist erhalten Sie eine extension-method auf die HttpRequestBase bekommen Objekt, das Sie in einem ActionMethod wie folgt zugreifen können:
bool isAjaxRequest = Request.IsAjaxRequest();
Bitte beachten Sie: Bei einem Projekt mit einer großen Anzahl von Anfragen, habe ich zufällig Ajax Anfragen von mobilen Browsern bekommen, die 'Request.IsAjaxRequest()' falsch zurückgegeben haben !!! Ich musste meinen Anforderungen einen Abfragezeichenfolge-Parameter hinzufügen (wie "partiell = 1"), um auf der sicheren Seite zu sein. –
der beste Weg, um zu überprüfen, ob die Anforderung eine ajax-Anforderung ist Request.IsAjaxRequest()
zu überprüfen. Es ist gut zu wissen, dass das MVC-Framework unter der Haube nach Ajax-Anfragen in den Anfrage-Parametern ODER dem Anfrage-Header sucht. Der Code in ASP.Net MVC-Quellcode ist:
public static bool IsAjaxRequest(this HttpRequestBase request) {
if (request == null) {
throw new ArgumentNullException("request");
}
return (request["X-Requested-With"] == "XMLHttpRequest") || ((request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest"));
}
Also, wenn Sie es wollen mannually überprüfen (was nicht empfohlen wird), die Sie beide überprüfen.
Während dies in den meisten Fällen zuverlässig sein wird, sollte der Fragesteller wissen, dass dies * leicht * gefälscht werden kann. –
Bitte beachten Sie: Bei einem Projekt mit einer großen Anzahl von Anfragen, habe ich zufällig Ajax Anfragen von mobilen Browsern bekommen, die 'Request.IsAjaxRequest()' falsch zurückgegeben haben !!! Ich musste meinen Anforderungen einen Abfragezeichenfolge-Parameter hinzufügen (wie "partiell = 1"), um auf der sicheren Seite zu sein. –