2017-03-20 5 views
0

Eine sehr noob Frage, aber ich kann nicht vollständig verstehen, warum in dem folgenden Code kann ich nur HttpPost verwenden (so kann es laufen) und nicht HttpGet. Kann mir bitte jemand erklären?Warum kann ich GET anstelle von POST nicht verwenden?

[HttpPost] 
     public ActionResult checkNumFocuses() 
     { 
      //stuff happening 

      if (count == 3) 
      { 
       return Json(false); 
      } 
      else 
      { 
       return Json(true); 
      } 

     } 

Das obige ist meine Aktionsmethode, die wahr/falsch zurückgibt.

Dies ist der Ajax-Aufruf auf das konfrontiert:

$.ajax({ 
     type: "POST", 
     url: '@Url.Action("checkNumFocuses", "Home")', 
     dataType: "json", 
     success: successFunc, 
     error: errorFunc 
}); 
function successFunc(data, status) { 
    if (data == false) { 
     $(".alert").show(); 
     $('.btnfc').addClass('disabled');   
    } 
} 

Ich kann nicht undertant warum, wenn ich das HttpPost Attribut löschen (so ist es standardmäßig GET) und die Art in dem Ajax-Aufruf von POST ändern GET .

+1

erlauben Was passiert, wenn Sie es löschen? Sie sind in dieser Hinsicht nicht klar. – tadman

+0

Sie können GET.What funktioniert nicht für Sie? –

+0

Wenn ich es lösche und wenn ich den Fronted Teil so ändere, dass der Typ GET ist, wird die Fehlerfunktion ausgeführt. Ansonsten funktioniert es so, wie ich es eingefügt habe. –

Antwort

4

Ja. Sie können Json von einer GET-Methode zurückgeben. Aber stellen Sie sicher, dass Sie die Json Methodenüberladung verwenden, die die JsonRequestBehavior Enumeration einnimmt.

Hier sagen Sie explizit, dass Sie Json-Daten von Ihrer GET-Aktionsmethode zurückgeben möchten.

public ActionResult checkNumFocuses() 
{ 
    //stuff happening 
    if (count == 3) 
    { 
     return Json(false,JsonRequestBehavior.AllowGet); 
    } 
    else 
    { 
     return Json(true,JsonRequestBehavior.AllowGet); 
    } 
} 

Derzeit sind Sie immer eine 500-Fehlerantwort (statt 200 OK mit den gültigen Daten), weil Sie versuchen, json Daten aus der GET-Aktion-Methode (ohne Einzelheiten enthalten den JsonRequestBehavior Enum-Wert) zurückzukehren. Da die Antwort 200 nicht OK ist, geht es zu Ihrem Fehlerhandler Teil Ihres Ajax-Aufrufs.

Im Idealfall sollten GET-Operationen idempotent sein. Das bedeutet unabhängig davon, wie oft Sie es ausführen, es sollte keine Daten ändern (und gibt die gleiche Antwort zurück). In Ihrem Fall verarbeitet Ihre Methode keine Daten. Solange Sie in Ordnung sind, dass Benutzer auf diese URL in einer Browser-Registerkarte zugreifen und das Ergebnis sehen können, können Sie dies als GET-Methode beibehalten. In einer ASP.NET MVC-Anwendung soll die GET-Methode normalerweise eine View/View-Antwort (Markup) zurückgeben, und die POST-Methode führt in der Regel eine Verarbeitung der bereitgestellten Formulardaten/AJAX-Daten aus (z. B. einige aktualisieren) Daten usw.) und gibt eine Antwort zurück, die kannJSON sein. Aber wenn Sie wirklich Json Daten von Ihrer GET Aktion Methode zurückgeben wollen, müssen Sie explizit angeben, dass das obige Verfahren verwenden wir

taten

Natürlich Web-API hat ein anderes Konzept (und Implementierung hinter der Szene)

+0

Danke. Aber, welche der beiden ist in diesem Fall am besten zu verwenden? Und warum? –

+1

In diesem Fall können Sie GET mit der Überladung verwenden, die in der Antwort erwähnt wird.(Angenommen, Sie sind in Ordnung, wenn Leute direkt auf die Registerkarte zugreifen und das Ergebnis sehen) – Shyju

+1

Vielen Dank für die ausführliche Antwort :) –

1

Sie können ein GET verwenden. Aber Sie müssen auch ein GET in der JsonRequestBehavior

[HttpGet] 
public ActionResult checkNumFocuses() 
{ 
    .... 
    return Json(true, JsonRequestBehavior.AllowGet); 
} 
+0

Danke. Aber, welche der beiden ist in diesem Fall am besten zu verwenden? Und warum? –

+1

Wenn Sie Daten in der Methode ändern (z. B. Aktualisieren einer Datenbank), sollte es ein POST sein. Ansonsten kann es beides sein. –

+0

Für eine Aktualisierung eines vorhandenen Datensatzes sollten Sie entweder einen PUT oder PATCH verwenden. POST sollte nur zum Erstellen eines neuen Datensatzes dienen. –

Verwandte Themen