2010-03-04 20 views
15

Używam ASP.NET MVC do tworzenia strony internetowej. Używam jquery dla funkcji AJAX. W metodach działania chcę zwrócić błąd, który sygnalizuje, że dane wejściowe nie są poprawne lub że nie można wykonać akcji. W takich przypadkach błędów, oczekuję wywołania błędu JQuery ajax i mogę podjąć odpowiednie działania tam. Nie znalazłem sposobu, jak to zrobić. Oto moja metoda działania.Jak zwrócić błąd z działania ASP.NET MVC

Co należy wysyłać z akcji, aby uruchomić procedurę obsługi błędów jQuery?

public ActionResult AddToFavourites(int entityId, string entityType) 
    { 

     if (!Request.IsAjaxRequest()) 
      throw new InvalidOperationException("This action can be called only in async style."); 

     try 
     { 
      RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType); 
      string status = ""; 

      if (typeOfFavourite == RBParams.EntityType.BusinessEntity) 
      { 
       status = MarkFavouriteEntity(entityId); 
      } 
      else if (typeOfFavourite == RBParams.EntityType.Review) 
      { 
       status = MarkFavouriteReview(entityId); 
      } 
      else 
      { 
       throw new InvalidOperationException("The type of the entity is not proper"); 
      } 

      return Content(status); 

     } 
     catch (Exception ex) 
     { 

      return Content("Error"); 
     } 
    } 

Odpowiedz

22

Twój obsługi błędów ajax zostanie wywołana, gdy działanie nie zwraca kodu stanu oczekiwanego. Na przykład zostanie wywołany, jeśli akcja nie zostanie znaleziona lub jeśli rzucisz wyjątek, którego nie obsługujesz. W twoim przypadku zostanie on wywołany, jeśli nie zauważysz błędu w działaniu (ponieważ akcja zwróci kod statusu 500).

Nie zrobiłbym tego jednak w ten sposób, ponieważ prawdopodobnie jest to oczekiwany błąd. Wolałbym przywrócić JSONA zarówno wtedy, gdy ci się uda, jak i gdy masz błąd. Następnie możesz wskazać, czy jest to udane połączenie, czy nie. Coś takiego:

public ActionResult AddToFavourites(int entityId, string entityType) 
{ 

    if (!Request.IsAjaxRequest()) 
     throw new InvalidOperationException("This action can be called only in async style."); 

    try 
    { 
     RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType); 
     string status = ""; 

     if (typeOfFavourite == RBParams.EntityType.BusinessEntity) 
     { 
      status = MarkFavouriteEntity(entityId); 
     } 
     else if (typeOfFavourite == RBParams.EntityType.Review) 
     { 
      status = MarkFavouriteReview(entityId); 
     } 
     else 
     { 
      throw new InvalidOperationException("The type of the entity is not proper"); 
     } 

     return Json(new { Success = true, Status = status }); 

    } 
    catch (Exception ex) 
    { 

     return Json(new { Success = false, Message = ex.Message }); 
    } 
} 

Następnie obsługuje się go w taki sam sposób, jak udane połączenie. Właśnie sprawdzasz właściwość Success swojej odpowiedzi json. Następnie obsługuje nieoczekiwane błędy w wywołaniu błędu.

+0

Bardzo wyraźnie wyjaśnione. Wielkie dzięki, Mattias Jakobsson. – mohang

+0

Czy ustawienia 'Json' podane w twoim przykładzie zostaną ustawione na zmienne' xhr' klienta? – Shimmy

+3

Nie spadłem, ale nie zgadzam się. (Przepraszam, @Mattias). Spowoduje to uruchomienie wywołania zwrotnego "sukcesu" JavaScriptu. Zawsze chcemy, aby wywołanie zwrotne błędu było uruchamiane, gdy wystąpi błąd na serwerze. To narusza symantię. Zasadniczo chcielibyśmy zwrócić błąd w serii 500. – Rap

0

Ci shoud config jQuery obsłużyć błąd:

$.ajaxSetup({ 
    error: function(xhr) { 
     alert(xhr.statusText); 
    } 
}) 
+2

Ild615, zrobiłem to w $ .ajaxSetup (...). Mój problem polega na tym, co powinienem wysłać z Action, aby uruchomić tę procedurę obsługi błędów. – mohang

9

Odpowiedź Mattias Jakobsson ma rację. Ale myślę, że najlepszym sposobem zwrócenia błędu do jQuery jest utworzenie JSON i wysłanie go ze statusem 500. Jednak kiedy zrobiłem to i próbowałem wdrożyć moją witrynę MVC za pomocą IIS 7, zorientowałem się, że zwróciło mi to zamówienie strona zamiast wiadomości.

Kod było ...

catch (Exception ex) 
{ 
    Response.StatusCode = 500; 
    return Json(new { error = ex.Message }); 
} 

Ale wtedy zobaczyłem this thread, które doprowadziły mnie do tego web site (od Rick Strahl).

Ogólnie, zrozumiał, że trzeba powiedzieć IIS, aby nie wstrzyknąć niestandardowej strony błędu, więc trzeba tę flagę (w global.asax lub do połowu):

Response.TrySkipIisCustomErrors = true;

Tak więc, w jQuery kod zachowuje się tak samo:

$.ajax({...}) 
.done(function (result) {...}) 
.fail(function (e) { 
    console.log(e.responseJSON.error); 
}); 
+1

To jest doskonała i kompletna odpowiedź. Pokazujesz przykład kontrolera ** i ** odpowiedniego wywołania AJAX. Dzięki za poświęcenie czasu. – Doppelganger

Powiązane problemy