Подтвердить что ты не робот

Как я могу вернуть 500 ошибок в формате JSON в ASP.NET MVC?

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

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

  • Возможно ли вернуть JSON с кодом состояния http 500?

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

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

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

4b9b3361

Ответ 1

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

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