2010-02-05 5 views
21

Im Moment feuern meine Ajax-Beiträge alle ihre Error-Ereignisse, auch wenn die Aktion keinen Fehler verursacht hat. Ich habe eine Aktion ASP.NET MVC, die wie folgt aussieht:Was von der ASP.NET MVC-Aktion zurückgegeben werden muss, damit das jQuery-Ajax-Erfolgsereignis ausgelöst werden kann?

[AcceptVerbs(HttpVerbs.Post)] 
public virtual ActionResult StuffToDo(int id) 
{ 
    // do various things that work ... 
    return new JsonResult(); // i have to return something, so this... 
} 

Auf der Client-Seite habe ich das jQuery:

$('#actionClick').click(function() { 
    if (confirm('Are you sure?')) { 
     $.ajax({ 
      type: "POST", 
      url: "/Customer/StuffToDo/<%= Model.Customer.Id %>", 
      contentType: "application/json; charset=utf-8", 
      data: "{}", 
      dataType: "json", 
      success: function() { 
       ShowSuccessResult("Yay!"); 
      }, 
      error: function(xhr, ajaxOptions, thrownError) { 
       ShowErrorResult("Boo! Message:" + xhr.responseText); 
      } 
     }); 
     } 
     return false; 
}); 

Wenn die Aktion erfolgreich ist (keine Ausnahmen geworfen), dann würde ich erwarten, dass die Event Event Handler ausgelöst werden. Stattdessen wird das Fehlerereignis ausgelöst. Gibt es etwas, das ich zurückgeben oder ändern sollte, damit das Erfolgsereignis ausgelöst wird?

Ich weiß, diese Frage ist im Grunde das gleiche wie this other question, aber mein Fehlerhandler hat bereits die erweiterte Signatur, die die Frage der anderen Person gelöst.

bearbeiten pro Anfrage, hier ist die Antwort, die ich bin immer:

Link to the screen shot (nicht sicher, wie es in Frage zeigen)

bearbeiten änderte ich die Gibt den Wert an Null zurück, um zu sehen, ob dies Auswirkungen hat, aber keine Verhaltensänderung.

bearbeiten Es ist wie folgt zu aussehen beginnt, ist ein Problem mit HTTPS. Ich bekomme mehrere Antworten von der Anfrage. Die ersten 2 sind 401 Meldungen und dann bekomme ich eine 200

+0

Was ist in der HTTP-Antwort? – Pointy

+0

können Sie einen Screenshot der Firebug Anfrage Antwort von der Konsole – Cherian

+0

und was ist der xhr.responseText? –

Antwort

36

Ich glaube, das Problem ist, dass Sie nicht alles, was in der JsonResult zurück. Versuchen Sie:

return this.Json(string.Empty); 

und sehen, ob das funktioniert. Ich denke, dass das Problem ist, dass Sie nichts auf den Aufruf jQuery eher als ein leeres JSON-Set sind Rückkehr: Ihr Rückgabetyp:

{} 
+0

JsonResult akzeptiert keine Argumente. Ich habe die Rückkehr auf null geändert, aber das hat das Ergebnis nicht beeinflusst. –

+0

@Sailing Judo - Ich habe das entwertet und das Codebeispiel korrigiert. Der Controller macht eine Json() - Methode verfügbar, die ein Objekt akzeptiert und ein JsonResult-Objekt zurückgibt. – 48klocs

+0

das war das Problem! Das hätte ich in einer Million Jahren nie erwartet. schön zu lösen. –

17

ein leeres Ergebnis zurückkehrend auch

return new EmptyResult(); 

Hinweis nützlich sein kann, muss nicht ActionResult oder Ereignis sein, das von ihm erbt. In der Tat können Sie mit mvc jede öffentliche Methode aufrufen. Sie sollten jedoch immer den explizitsten Rückgabetyp verwenden, den Sie möchten, genau wie jede andere Methode (z. B. JsonResult).

-3

Der Rückgabetyp Ihrer Methode sollte JsonResult anstelle von ActionResult sein.

+8

Ein JsonResult ist ein ActionResult. – msfanboy

8

2 schnelle Notizen für alle hier Landung kämpfen, um die Ajax jQuery success Rückruf von einer MVC-Controller auslösen:

  1. Wenn Sie type: "GET" in Ihrem Ajax sind, werden Sie JsonRequestBehavior.AllowGet müssen umfassen die umgehen Standardmäßige Anti JSON Hijacking security measures

return Json(true, JsonRequestBehavior.AllowGet); 
  1. Wie oben, wenn Sie in der Ajax-Anfrage dataType: 'json' angegeben haben, wenn Sie einen unidirektionalen Anruf tätigen (z. Save) wo Sie nichts zurück benötigen, können Sie fast alles serializable wie Json von der Steuerung zurückgeben. Aber mit einer 200 muss etwas zurückgegeben werden. Verwenden Sie 204, wenn keine Daten zurückgegeben werden.

Wrong - Löst die Ajax error Handler!

// Nope - Status 200 must have some content 
return new HttpStatusCodeResult(HttpStatusCode.OK); 

// Also returns a 200 with no data - not allowed 
return new EmptyResult(); 

Works - löst den Ajax Erfolg Handler:

// Return a 204 if there's no data 
return new HttpStatusCodeResult(HttpStatusCode.NoContent); 

// Return something with a 200 return 
return Json(new {Success = true}); 
+1

Das war mein Problem. Ich machte ein GET und vergaß AllowGet, also warf die Rückkehr tatsächlich eine Ausnahme auf und so behandelte mein Javascript das als eine Störung. – chrismay

Verwandte Themen