2016-01-26 33 views
0

當我調用Exception Filter時,我希望仍然會調用控制器中的預期操作。我已經創建了以下個IExceptionFilter:如何允許自定義ExceptionFilter在異常期間繼續調用指定的操作方法

public class ArgumentExceptionFilter : FilterAttribute, IExceptionFilter 
    { 
     public void OnException(ExceptionContext filterContext) 
     { 
      if (filterContext.Exception.GetType() == typeof(System.ArgumentException)) 
      { 
       //Some logic to create a default "SettingsRoot" parameter 

       //This simply surpresses MVC from raising exception 
       filterContext.ExceptionHandled = true; 
      } 
     } 
    } 

和該過濾器被應用到該控制器的操作方法:

[ArgumentExceptionFilter] 
    public ActionResult MyActionMethod(SettingsRoot settings) 
    { 
    ActionResult actionResult = null; 

    //Do stuff with settings 

    return actionResult; 
    } 

我想有「MyActionMethod()」如果我們得到一個可以不管叫觸發ExceptionFilter的異常。我也嘗試使用「RedirectToRouteResult()」方法,但沒有奏效。 有什麼建議嗎?

+0

it _is_被調用,並且異常發生在它內部的某處。 – solidau

回答

0

您可以使用filterContext的Result屬性重定向到具有默認參數的控制器操作。

public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception.GetType() == typeof(System.ArgumentException)) 
     { 
      //This simply surpresses MVC from raising exception 
      filterContext.ExceptionHandled = true; 

      //Some logic to create a default "SettingsRoot" parameter 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
      { 
       { "controller", "Default" }, 
       { "action", "MyActionMethod" }, 
       { "settings", new SettingsRoot() } 
      }); 
     } 
    } 
+0

獲取一條錯誤信息,說明「默認」控制器/路由不存在路由。我的控制器名稱是「MySettingsController」,如果我用「MySettings」替換控制器「Default」,執行不會轉到我的控制器操作方法,它只是簡單地返回到帶有HttpStatus 200和空內容的客戶端/調用者。我在這裏錯過了什麼? –

+0

順便說一下,這個動作方法是通過'PUT'來訪問的,而具有相同動作名稱的另一個動作方法是通過「GET」來更新Settings對象的,而不是確定是否重要。 –

+0

恐怕這是不可能的,重定向總是必須是一個視圖而不是一個後置操作。在這種情況下,您必須在將參數發送到控制器之前驗證並更新參數,並將其重定向到異常過濾器中的錯誤頁面。 – GuyVdN

相關問題