Обработка исключений в ASP.NET MVC и Ajax - фильтр [HandleException] - PullRequest
7 голосов
/ 04 апреля 2010

All

Я изучаю MVC и использую его для бизнес-приложений (MVC 1.0).

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

В настоящее время мы используем атрибут фильтра, который реализует IExceptionFilter. Мы украшаем базовый класс контроллера этим, чтобы все исключения на стороне сервера были приятно перенаправлены на страницу исключений, которая отображает ошибку и выполняет регистрацию.

Я начал использовать вызовы AJAX, которые возвращают данные JSON, но когда реализация на стороне сервера выдает ошибку, фильтр запускается, но страница не перенаправляется на страницу ошибок - она ​​просто остается на странице, которая вызывает AJAX способ.

Есть ли способ принудительного перенаправления на сервере (например, ASP.NET Server.Transfer или redirect?)

Я читал, что я должен вернуть объект JSON (обернуть исключение .NET) и затем перенаправить на клиента, но тогда я не могу гарантировать, что клиент перенаправит ... но потом (хотя я, вероятно, что-то делаю не так), сервер пытается перенаправить, но затем получает неавторизованное исключение (базовый контроллер защищен, а контроллер исключений - нет, поскольку он не наследуется от этого)

У кого-нибудь есть простой пример (код .NET и jQuery). Я чувствую, что я случайно пробую что-то в надежде, что это сработает

Фильтр исключений до сих пор ...

public class HandleExceptionAttribute : FilterAttribute, IExceptionFilter
{
    #region IExceptionFilter Members

    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled)
        {
            return;
        }

        filterContext.Controller.TempData[CommonLookup.ExceptionObject] = filterContext.Exception;

        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = AjaxException(filterContext.Exception.Message, filterContext);
        }
        else
        {
            //Redirect to global handler
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = AvailableControllers.Exception, action = AvailableActions.HandleException }));
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
        }
    }

    #endregion

    private JsonResult AjaxException(string message, ExceptionContext filterContext)
    {
        if (string.IsNullOrEmpty(message))
        {
            message = "Server error";   //TODO: Replace with better message
        }

        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;       //Needed for IIS7.0

        return new JsonResult
        {
            Data = new { ErrorMessage = message },
            ContentEncoding = Encoding.UTF8,
        };
    }
}

1 Ответ

2 голосов
/ 04 апреля 2010

Я использую инструмент OnFailure в Ajax.Beginform (). Обработчик ошибок на стороне клиента может перенаправить, установив window.location (среди ряда других опций). Это будет работать в 99% современных браузеров - если браузер поддерживает AJAX, он должен это поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...