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