asp.net фильтр пользовательских исключений mvc для принудительного возврата полного представления, а не частичного - PullRequest
6 голосов
/ 12 февраля 2010

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

Ответы [ 8 ]

2 голосов
/ 12 февраля 2010

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

1 голос
/ 28 марта 2011

Я использую инструмент OnFailure в теге формы

<form id="AJAXForm" method="post" action=""
   onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event),
   { insertionMode: Sys.Mvc.InsertionMode.replace, httpMethod: 'POST', 
   updateTargetId: 'myPartialPage', onSuccess: Function.createDelegate(this, ajaxFormSucced),
   onFailure: Function.createDelegate(this, ajaxFormFailure) });" >

... function ajaxFormSucced () { // Код для успеха } function ajaxFormFailure () { // Код ошибки }

1 голос
/ 19 февраля 2010

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

В нашем предыдущем проекте мы использовали специальный фильтр действий для обработки ошибок 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);
            }
        }
    }
0 голосов
/ 25 ноября 2013

Как говорит Максвелл, работайте с клиентом, используя что-то вроде этого

function handleError(ajaxContext) {
    // Load parent
}

@using (Ajax.BeginForm("Index", "Home", new AjaxOptions
{         
    UpdateTargetId = "MyDiv",
    OnFailure = "handleError"
}))

Что вы должны сделать, так это убедиться, что в коде ActionResult контроллера для NoAccess содержится следующий код, чтобы сработала ошибка ajax.

HttpContext.Response.StatusCode = 401;
0 голосов
/ 16 сентября 2011

Это поможет вам.

Просто добавьте метод расширения .IsAjaxRequest и верните код состояния 403 в браузер, jquery ajaxError обработает его, перенаправив на страницу входа

0 голосов
/ 05 июля 2011

Эта ссылка помогла мне Обработка исключений ASP.NET MVC при публикации на контроллере через Ajax с использованием jQuery

И наконец, при тестировании функции javascript начните с предупреждения в первой строке. Любые ошибки JavaScript в вашей функции могут привести к остановке функции в середине выполнения без обратной связи об ошибках JavaScript через браузер (в зависимости от настроек).

0 голосов
/ 31 августа 2010

Вы пытались очистить ответ? Контроллер все еще может устанавливать содержимое ответа.

filterContext.HttpContext.Response.Clear()
filterContext.Result = new JsonResult { Data = new { Message = message } };
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
0 голосов
/ 12 февраля 2010

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

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