У меня есть пользовательский фильтр исключения, что я называю на основании добавления атрибут [CustomExceptionFilter] к своему классу. Это работает, поскольку я хотел бы его к, однако если метод действия возвращает частичное представление (через запрос ajax), исключение (который является в основном перенаправлением к не авторизованной странице), загружает частичное представление той страницей. Существует ли способ, которым я могу вынудить это перезагрузить 'родительский' URL?
Вот код для пользовательского фильтра исключения
public class CustomExceptionFilter : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception.GetType() == typeof(CustomSecurityException))
{
filterContext.ExceptionHandled = true;
RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData);
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "NoAccess", action = "Index", message = filterContext.Exception.Message })).VirtualPath;
filterContext.HttpContext.Response.Redirect(url, true);
}
}
}
Это то, что вам нужно обработать в браузере. Попробуйте, например, обработать error() при вызове jQuery.ajax() (и, очевидно, не возвращайте редирект...).
Вы можете проверить, является ли запрос ajax-запросом или нет. Например, вы можете сделать следующее...
if (!filterContext.HttpContext.Request.IsAjaxRequest()){
//Return a ViewResult
//filterContext.ExceptionHandled = true;
//filterContext.Result = new ViewResult { ViewName = "Error" ... };
}
else{
//An ajax request.
//return a partial view
}
Однако, как сказал Максвелл, вы можете позволить исключению всплыть, если это ajax-запрос, и обработать ошибку на клиенте. Вы можете глобально настроить способ обработки исключений в ajax-запросах, как это описано здесь
Я бы посоветовал позволить исключению всплыть перед клиентом и обработать его, как предлагал Максвелл.
В нашем предыдущем проекте мы использовали специальный фильтр действий для обработки ошибок ajax (заимствован из Suteki Shop ). Обратите внимание, что статус ответа - 500 (внутренняя ошибка сервера). Статус ошибки требуется для ответа, чтобы вызвать делегат de Error () в вызове JQuery.ajax ().
public class HandleErrorWithAjaxAttribute : HandleErrorAttribute
{
public HandleErrorWithAjaxAttribute()
{
ShowStackTraceIfNotDebug = true;
}
public bool ShowStackTraceIfNotDebug { get; set; }
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
string content = ShowStackTraceIfNotDebug ||
filterContext.HttpContext.IsDebuggingEnabled
?
filterContext.Exception.StackTrace
:
string.Empty;
filterContext.Result = new ContentResult
{
ContentType = MediaTypeNames.Text.Plain,
Content = content
};
filterContext.HttpContext.Response.Status =
"500 " + filterContext.Exception.Message
.Replace("\r", " ")
.Replace("\n", " ");
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
else
{
base.OnException(filterContext);
}
}
}