asp.net mvc пользовательский фильтр исключения для принуждения возврата полного представления, не неравнодушного

У меня есть пользовательский фильтр исключения, что я называю на основании добавления атрибут [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);
        }
    }
}
6
задан Kyle 12 February 2010 в 16:44
поделиться

3 ответа

Это то, что вам нужно обработать в браузере. Попробуйте, например, обработать error() при вызове jQuery.ajax() (и, очевидно, не возвращайте редирект...).

2
ответ дан 17 December 2019 в 07:04
поделиться

Вы можете проверить, является ли запрос 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-запросах, как это описано здесь

0
ответ дан 17 December 2019 в 07:04
поделиться

Я бы посоветовал позволить исключению всплыть перед клиентом и обработать его, как предлагал Максвелл.

В нашем предыдущем проекте мы использовали специальный фильтр действий для обработки ошибок 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);
            }
        }
    }
1
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

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