Asp.net-Mvc

ASP.NET MVC Ajax 錯誤處理

  • January 16, 2011

當 jquery ajax 呼叫動作時,如何處理控制器中拋出的異常?

例如,我想要在 ajax 呼叫期間在任何類型的伺服器異常上執行的全域 javascript 程式碼,如果處於調試模式或只是正常的錯誤消息,則顯示異常消息。

在客戶端,我將呼叫一個關於 ajax 錯誤的函式。

在伺服器端,我是否需要編寫自定義操作過濾器?

如果伺服器發送一些不同於 200 的狀態碼,則會執行錯誤回調:

$.ajax({
   url: '/foo',
   success: function(result) {
       alert('yeap');
   },
   error: function(XMLHttpRequest, textStatus, errorThrown) {
       alert('oops, something bad happened');
   }
});

並註冊一個全域錯誤處理程序,您可以使用以下$.ajaxSetup()方法:

$.ajaxSetup({
   error: function(XMLHttpRequest, textStatus, errorThrown) {
       alert('oops, something bad happened');
   }
});

另一種方法是使用 JSON。因此,您可以在伺服器上編寫一個自定義操作過濾器來擷取異常並將它們轉換為 JSON 響應:

public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
   public void OnException(ExceptionContext filterContext)
   {
       filterContext.ExceptionHandled = true;
       filterContext.Result = new JsonResult
       {
           Data = new { success = false, error = filterContext.Exception.ToString() },
           JsonRequestBehavior = JsonRequestBehavior.AllowGet
       };
   }
}

然後用這個屬性裝飾你的控制器動作:

[MyErrorHandler]
public ActionResult Foo(string id)
{
   if (string.IsNullOrEmpty(id))
   {
       throw new Exception("oh no");
   }
   return Json(new { success = true });
}

最後呼叫它:

$.getJSON('/home/foo', { id: null }, function (result) {
   if (!result.success) {
       alert(result.error);
   } else {
       // handle the success
   }
});

引用自:https://stackoverflow.com/questions/4707755