2011-05-02 85 views
3

我正在尋找一種好的/聰明的/乾淨的方式來全局處理錯誤,以便如果請求是Json併發生異常,結果應該是json而不是html。MVC 3 json請求應該收到異常的json響應

尋找現有的解決方案或如何建立自己的一些信息。

回答

7

的常用方法是編寫自定義異常過濾器:

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 
     }; 
    } 
} 

這可以被註冊爲在Global.asax中的全局過濾器。然後簡單地查詢一些行動:

$.getJSON('/someController/someAction', function (result) { 
    if (!result.success) { 
     alert(result.error); 
    } else { 
     // handle the success 
    } 
}); 
+0

這不會運行每個異常? – Dashu 2011-05-02 17:41:40

+0

@Dashu,是的,每個例​​外。您還可以測試請求是否是AJAX請求,以及請求內容類型是否爲application/json,並且只有在這種情況下才處理異常。 – 2011-05-02 18:45:46

+0

看起來像一個很好的解決方案,謝謝Darin! – Dashu 2011-05-03 08:40:40

0

這可能是一個自定義屬性...可能甚至是HandleErrorAttribute的子類。技巧將是如何知道控制器操作是否要返回JSON。這可以像加入後綴GetCustomerDetailsJson這些方法名稱一樣簡單。要做到這一點