2016-11-14 51 views
0

我有一個奇怪的問題,或預期的(只是我沒有得到它)​​。.NET核心異常過濾器停止控制器執行

我寫一個異常過濾器,以便它可以捕獲一個特定的異常,並添加異常消息到ModelState中(以避免在使用的控制器的try/catch塊)。

我遇到的問題是,當發生異常時,我得到了一個空白頁面,而不是觀點。它似乎沒有繼續留在控制器中,我認爲它應該。

過濾器:

public class ValidationFilter : ExceptionFilterAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     context.ExceptionHandled = true; 
     context.ModelState.AddModelError("", context.Exception.Message); 
    } 
} 
+0

見http://stackoverflow.com/a/24202011/43846一種替代方法 – stuartd

回答

1

似乎比較合乎邏輯的我。如果你在這裏做異常處理,你需要確保你返回的是一個響應,因爲流被中斷了。

我想這是怎麼回事模型:

try 
{ 
    var model = SomeMethodThatThrowsException(); 
    return View(model); 
} 
catch 
{ 
} 

現在怎麼會是能夠與返回,以便繼續進行,如果除非你處理它在那裏的第一行已拋出一個異常,並告訴它該怎麼做?

我不是100%肯定它是不可能的,做你想做的,但這似乎相當邏輯流程(至少與以前版本的ASP.NET加工後)。

可能的解決方案

  • 重定向到您的例外爲模型一個特殊的錯誤頁面如
  • 轉換爲json並處理SPA應用程序中的結果。
  • 如果您需要將錯誤添加到返回的視圖中,可以裝飾你的函數調用,無論是與一個單獨的服務或一個簡單的委託,例如
public void MyAction() 
{ 
    MyModel model = ExecuteSafely(SomeMethodThatThrowsException()); 
    return View(model); 
} 

private MyModel ExecuteSafely(Func<MyModel> action) 
{ 
    try 
    { 
     return action(); 
    } 
    catch 
    { 
     // Add what you need to a model/view/etc. here 
     return null; 
    } 
} 

這是一些例子,所以不會或許編譯,但只是給我的意思的指示。

+0

我之所以需要它繼續,並顯示了同樣的觀點,而不是錯誤頁面是,我需要處理exeption消息作爲驗證消息,而不用將用戶重定向到另一個頁面,以允許他/她解決問題(如果它是可修復的)。 –

+0

我明白了,我想你可以通過裝飾器來運行你的方法。因此,您需要嘗試/抓住適當的地方,而不是在過濾器中。我會擴大答案。 –