2016-11-14 91 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

我明白了,我想你可以通过装饰器来运行你的方法。因此,您需要尝试/抓住适当的地方,而不是在过滤器中。我会扩大答案。 –