2014-06-30 5 views
1

Я новичок в C# и asp mvc, и я не могу найти способ справиться с исключениями глобально, но возврат на ту же страницу из них был сгенерирован. Сейчас в моих контроллеров у меня есть что-то подобное во всех методах пост:asp mvc5 глобальный обработчик исключений на той же странице

try 
{ 
    service.Action(object); 
    return RedirectToAction("Index"); 
} 
catch (MyBusinessException e) 
{ 
    ViewData["error"] = (e.InnerException.Message ?? ""); 
    return View(object); 
} 

Сообщение внутреннего исключения является дружественным сообщение, как «Вы не можете создать две статьи с тем же кодом», что я хочу показать пользователю в виде создания статьи, а не отправить его на страницу с ошибкой

Я пытался воспроизвести это поведение, создав базовый контроллер, который переопределяет метод OnException, но я не знаю, как вернуться к на той же странице, откуда я пришел, и покажу сообщение об ошибке.

Редактировать на основе ответа от @JotaBe

Я создал глобальный OnException фильтр и зарегистрирован в FilterConfig.cs, теперь я могу вернуться на страницу с был я пришел, но модель, которую я получаю из ExceptionContext, она равна нулю, поэтому я получаю исключение NullPointerException при просмотре представления.

Это мой текущий метод:

public override void OnException(System.Web.Mvc.ExceptionContext filterContext) 
    { 
     var currentController = (string)filterContext.RouteData.Values["controller"]; 
     var currentActionName = (string)filterContext.RouteData.Values["action"]; 

     LOGGER.ErrorFormat("Action: {0} - Controller: {1} - ExceptionMessage: {2} - InnerException: {3}", 
      currentActionName, 
      currentController, 
      filterContext.Exception.Message, 
      filterContext.Exception.InnerException.Message); 

     Exception e = filterContext.Exception; 
     filterContext.ExceptionHandled = true; 
     filterContext.Result = new ViewResult() 
     { 
      ViewName = currentActionName, 
      ViewData = filterContext.Controller.ViewData, 
      MasterName = Master,     
      TempData = filterContext.Controller.TempData 
     }; 
    } 

Как я могу получить модель, которая была размещена?

+0

Можете ли вы предоставить еще один код здесь. –

+0

Вы также можете использовать метод 'Application_Error' в global.asax и обрабатывать ошибку. –

+0

Что такое «модель, которая была опубликована»? – JotaBe

ответ

0

Что вам нужно сделать, это использовать фильтры. Фильтр - это атрибут, который может применяться к контроллерам для изменения их поведения. Here you have the official MSDN docs for MVC filters.

В предыдущем документе вы можете увидеть, что есть фильтр с именем HandleErrorAttribute, который вам нужен для вашего конкретного случая.

Фильтр может применяться глобально (регистрировать его при запуске приложения) или украшать каждый отдельный контроллер. Для получения хорошего объяснения и примера вы можете прочитать this blog entry.

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

+0

Спасибо за ваш ответ, я обновил исходный вопрос методом OnException – Rumal

Смежные вопросы