2011-05-02 3 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

+0

@ Дашу, да за каждое исключение. Вы также можете проверить, был ли запрос запросом AJAX и был ли тип содержимого запроса - application/json, и только в этом случае обрабатывать исключение. –

+0

Похоже, хорошее решение, спасибо Дарин! – Dashu

0

Возможно, это возможно с помощью настраиваемого атрибута ... возможно, даже подкласса HandleErrorAttribute. Трюк будет заключаться в том, как узнать, будет ли действие контроллера возвращать JSON или нет. Это может быть так же просто, как суффикс этих имен методов, таких как GetCustomerDetailsJson.

Смежные вопросы