【问题标题】:How to catch an exception thrown by a filter in .NET's MVC?如何在 .NET 的 MVC 中捕获过滤器引发的异常?
【发布时间】:2009-03-23 19:11:40
【问题描述】:

我正在开发的应用程序中的一个过滤器检查用户是否拥有他们试图更改的项目。该动作由[RequiresOwnership] 属性修饰,在属性逻辑中,我检查用户是否拥有该项目,如果不拥有,则抛出UnauthorizedAccessException

我的问题是:我在哪里可以捕获该异常?理想情况下,我希望将用户重定向到解释为什么不允许他们尝试做的事情的页面,而不仅仅是显示异常页面。我不认为我会在由属性修饰的操作中捕获异常,那么在 .NET MVC 模型中,是否有一些应用程序的基础部分可以处理更高层抛出的异常?

编辑:我意识到我可以通过过滤器本身重定向到一个页面,但这对我来说似乎有点 hacky。最好通过属性抛出异常,并有一个标准的地方可以捕获和处理它们。

【问题讨论】:

    标签: c# .net model-view-controller exception filter


    【解决方案1】:

    我认为您想要的是控制器上的 [HandleError] 属性,它采用错误处理程序视图的可选路径。默认为 ~/Views/Shared/Error.aspx;您可以在那里为您的特定例外添加额外的支持。

    【讨论】:

      【解决方案2】:

      我遇到了这个问题,我解决它的方法是将异常添加到 FilterContext 的 TempData 集合中,而不是抛出它。然后您可以在您的操作方法中检查它,重新抛出它并适当地处理它:

      在属性中:

      if (/*some error condition*/)
         filterContext.Controller.TempData["Err"] = new Exception("An error");
      

      而在action方法中:

      var e = TempData["Err"] as Exception;
      if (e != null)
          throw e;
      

      这是一个不太理想的解决方案,但正如您所提到的,没有从属性中捕获异常的有用地方。

      【讨论】:

      • “没有从属性中捕获异常的有用地方。”@GalacticCowboy 的回答有什么问题?
      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多