Как я могу вернуть ошибку 500 в формате JSON в ASP.NET MVC? - PullRequest
11 голосов
/ 29 апреля 2011

Когда ASP.NET MVC выдает исключение, он возвращает ошибку 500 с типом ответа text/html - что, конечно, является недопустимым JSON.

Я хочу ответить на запрос Ajax, ожидающий JSON сошибка, которую я могу получить и отобразить пользователю.

  1. Можно ли вернуть JSON с кодом состояния HTTP 500?

  2. Если проблема заключается в отсутствии параметра, возникает ошибка 500до того, как контроллер даже вызывается - поэтому решение контроллера может не сработать.Например, оставляя обязательный параметр в вызове Action, который обычно возвращает JsonResult, ASP.NET MVC отправляет это обратно клиенту:

Ошибка сервера в '/' Заявка.Словарь параметров содержит пустую запись для параметра 'id' ненулевого типа 'System.Int32' для метода 'System.Web.Mvc.JsonResult EditUser (Int32, System.String, System.String, System.String, System.String, System.String, System.String, System.String, System.String) 'в' bhh '.Необязательный параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр.Имя параметра: параметры

Я использую jQuery;Есть ли лучший способ справиться с этим?

1 Ответ

9 голосов
/ 29 апреля 2011

Вы можете использовать собственный фильтр обработчика ошибок:

public class AjaxErrorHandler : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.ExceptionHandled = true;
            filterContext.Result = new JsonResult
            {
                Data = new { errorMessage = "some error message" }
            };
        }
    }
}

А затем украсьте свой контроллер / действия, которые вы вызываете через Ajax, или даже зарегистрируйте как глобальный фильтр.

Затем при выполнении Ajax-запроса вы можете проверить наличие свойства error:

$.getJSON('/foo', function(result) {
    if (result.errorMessage) {
        // Something went wrong on the server
    } else {
        // Process as normally
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...