微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我将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
The view ‘Error’ or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/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());根据this advice,由Atif author of ELMAH基于此Stack Overflow answer.

解决方法

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

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

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

>你抛出一个例外
> ElmahHandleErrorAttribute选择它,记录异常,调用base.OnException
> HandleErrorAttribute.OnException将操作的结果设置为ViewResult,并将View设置为“Error”
> ViewEngine无法找到此“错误”视图,因此抛出新的异常
> …由ELMAH记录,但未被ElmahHandleErrorAttribute记录(因为此异常发生在动作之外)
>相反,ASP.NET本身会选择它,并使用web.config中的errorPages
> …调用/错误/ ApplicationError
> …显示您想要的视图

…但实际上并不是你抛出的异常,而是ViewEngine抛出的异常.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐