2014-06-30 78 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

你也可以在global.asax中使用'Application_Error'方法並處理錯誤。 –

+0

什麼是「發佈的模型」? – JotaBe

回答

0

你需要做的是使用過濾器。過濾器是可以應用於控制器以修改其行爲的屬性。 Here you have the official MSDN docs for MVC filters

在前面的文檔中,您可以看到有一個名爲HandleErrorAttribute的過濾器,這是您在特定情況下需要的過濾器。

過濾器可以全局應用(在應用程序啓動時註冊)或裝飾每個單獨的控制器。對於一個很好的解釋和示例,你可以閱讀this blog entry

請記住,可以有與您所拋出的不同之處。因此,您應該考慮根據異常類型顯示不同信息的可能性。這個過濾器允許根據異常類型顯示不同的視圖。

+0

感謝您的回答,我用OnException方法更新了原始問題 – Rumal