2010-01-14 67 views
8

Мне нужно глобально перенаправить моих пользователей, если пользовательская ошибка выбрасывается в моем приложении. Я попытался поместить некоторую логику в свой файл global.asax для поиска моей пользовательской ошибки, и если она выбрана, выполните перенаправление, но мое приложение никогда не ударяет мой метод global.asax. Он продолжает давать мне ошибку, в которой говорится, что мое исключение было необработанным кодом пользователя.Redirect asp.net mvc, если выбрано настраиваемое исключение

вот что я имею в своем глобальном.

protected void Application_Error(object sender, EventArgs e) 
{ 
    if (HttpContext.Current != null) 
    { 
     Exception ex = HttpContext.Current.Server.GetLastError(); 
     if (ex is MyCustomException) 
     { 
      // do stuff 
     } 
    } 
} 

и мое исключение следующим образом:

if(false) 
    throw new MyCustomException("Test from here"); 

, когда я положил, что в попытке поймать из файла метания исключения, мой метод Application_Error никогда не будет достигнут. У кого-нибудь есть какие-то предложения относительно того, как я могу справиться с этим в глобальном масштабе (справиться с моим обычным исключением)?

спасибо.

1/15/2010 Редактировать: Вот что находится в // do stuff.

RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData); 
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "Home", action = "Index" })).VirtualPath; 
filterContext.HttpContext.Response.Redirect(url, true); 
+0

+1 для бита Do Stuff – stuartdotnet

ответ

10

Вы хотите создать фильтр клиентов для своих контроллеров/действий. Вам необходимо наследовать от FilterAttribute и IExceptionFilter.

Что-то вроде этого:

public class CustomExceptionFilter : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception.GetType() == typeof(MyCustomException)) 
     { 
      //Do stuff 
      //You'll probably want to change the 
      //value of 'filterContext.Result' 
      filterContext.ExceptionHandled = true; 
     } 
    } 
} 

После того, как вы создали, вы можете применить атрибут к BaseController, что все другие контроллеры наследуют от, чтобы сделать его сайт широкие функциональные возможности.

Эти две статьи могут помочь:

+0

ОК Я дам это. для тестирования, если бы я хотел добавить его к одному из моих контроллеров напрямую, как бы я это сделал? Извините за newbness:/ – Kyle

+0

Я попытался добавить атрибут «[CustomExceptionFilter]». К началу моего класса контроллера, а затем выбрасывая исключение, и он, похоже, не попадает в этот фильтр. Он не бросает ту же ошибку, что и раньше, но не попадает в мой настраиваемый фильтр исключений. Я также попытался применить его к методу action, который я нахожу, что должен выбросить исключение, и он там тоже не работает ... любые идеи? – Kyle

+0

поцарапал свой последний комментарий, я забыл вернуть свой бросок. Когда я это сделал, я получаю ту же ошибку, что и раньше, «мое исключение было необработанным по коду пользователя». Нужно ли мне это в попытке поймать? – Kyle

0

Я нашел этот ответ (и вопрос), чтобы быть полезным Asp.net mvc override OnException in base controller keeps propogating to Application_Error

Im ваш случай вещь, что вам «Отсутствует то, что вам нужно добавить свой собственный фильтр в FilterConfig.cs в App_Start Папка:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new CustomExceptionFilter()); 
     filters.Add(new HandleErrorAttribute()); 
    }