尽管指定了我自己的视图,ASP.NET MVC3仍然会查找Error.aspx / .cshtml

时间:2012-02-04 18:13:33

标签: asp.net asp.net-mvc-3 error-handling

我将ASP.NET MVC 3应用程序配置为通过两个操作重定向到Errors控制器 -

<customErrors mode="On" defaultRedirect="/Errors/ApplicationError">
    <error statusCode="404" redirect="/Errors/NotFound" />
</customErrors>

我有几个从每个动作方法呈现的视图:

  • /Views/Shared/NotFound.cshtml
  • /Views/Shared/ApplicationError.cshtml

在我的ErrorsController ApplicationError行动中,我执行以下操作:

public ActionResult ApplicationError()
{
    Response.StatusCode = 500;
    return View();
}

这样可以实现我的ApplicationError.cshtml视图,无论发生什么异常都记录下来,一切都很好。

然而,在ELMAH中,我发现记录了这个额外的错误:

  

System.InvalidOperationException   未找到视图“错误”或其主控,或者没有视图引擎支持搜索的位置。搜索了以下位置:〜/ Views / Throw / Error.aspx~ / Views / Throw / Error.ascx~ / Views / Shared / Error.aspx~ / Views / Shared / Error.ascx~ / Views / Throw / Error。 cshtml~ / Views / Throw / Error.vbhtml~ / Views / Shared / Error.cshtml~ / Views / Shared / Error.vbhtml

为什么当我已经处理错误并且我自己的视图已成功定位并呈现时,ASP.NET MVC仍然在寻找这些视图?

其他信息:

  • 我不在任何地方使用[HandleError]属性

  • 我将filters.Add(new HandleErrorAttribute());中的Global.asax.cs替换为filters.Add(new ElmahHandleErrorAttribute()); {{1}} this adviceStack Overflow answer基于author of ELMAH Atif {{3}}

1 个答案:

答案 0 :(得分:3)

我认为,虽然您已将HandleErrorAttribute替换为派生类(ElmahHandleErrorAttribute),但您的自定义属性OnException可能仍在调用base.OnException - 即HandleErrorAttribute.OnException

HandleErrorAttribute.OnException完全忽略web.config设置(除非让customErrors关闭时让ASP.NET显示标准YSOD),并将操作结果设置为状态码为500的ViewResult ,并View设置为“错误”(默认情况下,当尚未在属性上设置View属性时)。

即,我猜这样的事情发生了:

  1. 您抛出异常
  2. ElmahHandleErrorAttribute选择它,记录异常,调用base.OnException
  3. HandleErrorAttribute.OnException将操作结果设置为ViewResultView设置为“错误”
  4. ViewEngine无法找到此“错误”视图,因此抛出新的例外
  5. ...由ELMAH记录,但未被ElmahHandleErrorAttribute选中(因为此异常发生在操作之外)
  6. 相反,ASP.NET本身会选择它,并使用web.config中的errorPages
  7. ...调用/错误/ ApplicationError
  8. ...显示您想要的视图
  9. ...但实际上并不是你抛出的异常,而是ViewEngine投掷的异常。

    如果希望遵循web.config设置,您可能希望实现自己的异常处理,而不是基于HandleError。查看MVC源代码中的HandleErrorAttributehere),看看需要做什么(以及在您的情况下不应该做什么)。