Обработка исключений в ASP.NET MVC и Ajax - [HandleException] фильтр

Все,

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

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

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

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

Есть ли любой способ вызвать перенаправление на сервере (например, Сервер ASP.NET. Передача или перенаправление?)

Я считал, что должен возвратить объект 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,
        };
    }
}
7
задан GrahamB 3 April 2010 в 20:32
поделиться

1 ответ

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

2
ответ дан 7 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: