不同结果类型的MVC Controller.OnException

时间:2010-10-12 13:04:16

标签: asp.net-mvc asp.net-mvc-2

我正在尝试为我的MVC项目找到理想的异常处理策略。我已经完成了以下工作,正在寻找一些反馈。

问题:

我有不同的结果类型(页面,部分页面,JSON,文件等)。 Controller.OnException()没有简单的方法来确定客户期望的结果类型。没有什么特别的东西,当他们想要JSON等时,我正在提供HTML页面,这会导致显示问题。

解决方案:

  1. 我有一个抽象BaseController,其中包含HandleJsonException()HandlePartialPageException()HandlePageException()等实用函数。这些函数将:

    a)切换到Enterprise Library以进行日志记录和通知。

    b)以客户期望的格式设置结果视图。

    c)为错误设置适当的Http状态代码。

  2. 我根据结果类型将操作分成不同的控制器。例如,我没有AbcController而是AbcPageControllerAbcJsonController。此控制器的OnException调用其中一个基类实用程序处理程序。

  3. JavaScript(针对JSON和部分页面视图)查看状态代码以指导行为。

  4. 我关注的是显示逻辑正在指示控制器的设计,因此影响路由(不是URL,而是路由显然)。此外,这对于基本控制器上共享OnAuthenticate的先前继承策略有所不足。

    无论如何......正在寻找评论。并且可能链接到其他人解决这个问题的方法。

    干杯

2 个答案:

答案 0 :(得分:1)

  

Controller.OnException()没有简单的方法来确定客户期望的结果类型

您可以使用标准尊重客户端发送的Accept请求标头来指示它们支持和期望的内容类型。例如,如果您使用jquery.getJSON()方法,则会发送以下标头:Accept: application/json, text/javascript, */*。正如您所看到的,application/json是首选格式,您可以在控制器中使用此信息。

答案 1 :(得分:0)

我最终放弃了这种方法。

处理错误将直接从控制器操作返回适当的结果。

Controller.OnException中处理的未处理错误将:

a)将HttpStatusCode设置为500。 b)使用我们的应用程序错误页面呈现完整的HTML页面 c)将processed属性设置为true,因此自定义错误页面不会启动。

如果调用者期望HTML页面以外的其他内容(Ajax JSON,Partial Page,XML等)将检查500代码并忽略HTML内容。