2012-10-19 8 views
5

mam metodę w kontroler, który wygląda tak:wygeneruje błąd z powrotem do jQuery z MVC HttpPost

[HttpPost] 
public void UnfavoriteEvent(int id) 
{ 
    try 
    { 
     var rows = _connection.Execute("DELETE UserEvent WHERE UserID = (SELECT up.UserID FROM UserProfile up WHERE up.UserName = @UserName) AND EventID = @EventID", 
      new { EventID = id, UserName = User.Identity.Name }); 
     if (rows != 1) 
     { 
      Response.StatusCode = 500; 
      Response.Status = "There was an unknown error updating the database."; 
      //throw new HttpException(500, "There was an unknown error updating the database."); 
     } 
    } 
    catch (Exception ex) 
    { 
     Response.StatusCode = 500; 
     Response.Status = ex.Message; 
     //throw new HttpException(500, ex.Message); 
    } 
} 

I jak widać Próbowałem kilka różnych sposobów, aby rzucić ten błąd plecy. W JavaScript mam następujący blok do wywołania tej metody:

var jqXHR; 
if (isFavorite) { 
    jqXHR = $.ajax({ 
     type: 'POST', 
     url: '/Account/UnfavoriteEvent', 
     data: { id: $("#EventID").val() } 
    }); 
} 
else { 
    jqXHR = $.ajax({ 
     type: 'POST', 
     url: '/Account/FavoriteEvent', 
     data: { id: $("#EventID").val() } 
    }); 
} 

jqXHR.error = function (data) { 
    $("#ajaxErrorMessage").val(data); 
    $("#ajaxError").toggle(2000); 
}; 

Teraz to, co chcę zrobić, to pojawia się błąd, który występuje wyrzucane z powrotem do funkcji jqXHR.error tak, że można go obsługiwać prawidłowo.

Obecnie kod, który jest odkomentowany, zgłasza wyjątek, mówiąc, że tekst, który umieszczam w Status, jest niedozwolony, a kod komentarza faktycznie zwraca stronę błędu standardowego jako odpowiedź (co naprawdę nie jest zaskakujące).

Tak, mam kilka pytań:

  1. Jak mogę wyrzucić błąd prawidłowo?
  2. Co robi właściwość Response.Status?

Dzięki!

+0

Odkąd generujesz wyjątek ogólny, nie wyślę konkretnej wiadomości do klienta. Może to być poufna informacja o Twojej aplikacji. Jeśli wychwycisz wyjątki w domenie niestandardowej, w których masz kontrolę nad wiadomością, możesz wysłać je do klienta, ale w przypadku ogólnego wyjątku powinieneś wysłać ogólną wiadomość. – BZink

+0

@BZink, bardzo dobry punkt. Dziękuję Ci. –

Odpowiedz

3

Będziesz abled aby uzyskać jego status reakcji ze strony javascript, wykonując następujące czynności:

$.ajax({ 
    type: 'POST', 
    url: '/Account/UnfavoriteEvent', 
    data: { id: $("#EventID").val() }, 
    success: function(data, textStatus, jqXHR) { 
     // jqXHR.status contains the Response.Status set on the server 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // jqXHR.status contains the Response.Status set on the server 
    }}); 

Jak widać, trzeba zdać funkcję error z funkcją ajax ... w was na przykład ustawiasz tę funkcję na właściwość error z jqXHR bez żadnego efektu.

Dokumentacja wydarzeń ajax

docs jQuery powiedzieć, że ciąg błędu wejdzie w parametrze errorThrown.

Nie używaj Response

Zamiast tego, należy zwrócić HttpStatusCodeResult:

[HttpPost] 
public void UnfavoriteEvent(int id) 
{ 
    try 
    { 
     var rows = _connection.Execute("DELETE UserEvent WHERE UserID = (SELECT up.UserID FROM UserProfile up WHERE up.UserName = @UserName) AND EventID = @EventID", 
      new { EventID = id, UserName = User.Identity.Name }); 
     if (rows != 1) 
     { 
      return new HttpStatusCodeResult(500, "There was an unknown error updating the database."); 
     } 
    } 
    catch (Exception ex) 
    { 
     return new HttpStatusCodeResult(500, ex.Message); 
    } 
} 
+0

To zdecydowanie wprowadziło mnie w metodę błędów w JavaScript, więc dziękuję! Ale żądany ciąg znaków błędu nie znajduje się w 'Response.Status'. Co robię źle po stronie serwera i jak mogę dostać ten prosty komunikat do klienta? –

+0

Dzięki, to jest dokładnie to, czego potrzebowałem! –

Powiązane problemy