【问题标题】:"[HandleError]" at class level, override at method level“[HandleError]”在类级别,在方法级别覆盖
【发布时间】:2012-06-29 19:54:34
【问题描述】:

我有一个在类级别具有 HandleError 属性的 C# MVC 3 控制器

[HandleError(View = "MyErrorPage")]   
public class MyController : Controller
{

在我所掌握的方法级别:

[HttpPost]
[MyExceptionHandler]
public ActionResult DoSomeStuff(FormCollection fc)
{

MyExceptionHandler 的样子:

public class MyExceptionHandlerAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        //do Stuff

        JsonResult result = new JsonResult {
            Data = new { 
                    error = "Your request blah blah...."
                }
            };
        filterContext.Result = result;
        filterContext.ExceptionHandled = true;
    }
}

这在我的本地主机上运行良好。 IE。在调用方法“DoSomeStuff”[MyExceptionHandler] 中的异常时,不会调用类级别 [HandleError]。 然而,在开发环境中,类级别 [HandleError] 开始发挥作用。结果是渲染了 HandleError view=MyErrorPage。

  1. 我知道 [HandleError] 在 localhost 上是多余的,但可以更正(或配置选项)?
  2. 我不确定是否在开发环境(不是本地主机)上调用了 MyExceptionHandler。可能在类级别[HandleError]之前调用?

我的问题是我需要 [MyExceptionHandler] 作为唯一调用的处理程序。 我希望能够在我的本地主机上调用 [HandleError],以便我可以在本地模拟问题。

【问题讨论】:

  • 您未显示的//do Stuff 内容会引发异常吗?如果可以的话,它将解释这种行为。此外,在调用 DoSomeStuff 操作(GET 或 POST)时,您在 AJAX 请求中使用了哪个 HTTP 动词?如果您使用 GET,这也可以解释您的问题。
  • 感谢达林的回复。不,我不认为 //do 的东西会引发异常。 POST 是使用的 HTTP 动词。我已经更新了问题中的代码以显示这一点。表单指定method="POST"。谢谢。
  • 您不认为或您已验证并确定?
  • 好点,我有 99.9% 的把握肯定不会出现异常,但由于 IT 问题目前无法验证。当我验证时,我会在这里发表评论。谢谢

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


【解决方案1】:

我找到了解决办法:

[HandleError(View = "MyErrorPage", Order = 2)]

解决了问题(具体来说,Order = 2)。

原因是这个处理程序现在的优先级低于方法级处理程序。因此,首先执行方法级别的处理程序,根据上面的代码,它将异常标记为已处理,因此永远不会执行控制器级别的处理程序。

问题仅在本地主机上的原因是因为默认情况下本地主机上未启用[HandleError]。但是,在开发环境中它是自动启用的。

然后我认为我可以通过设置在 localhost 上看到问题:

<system.web>
   <customErrors mode="On" />

但由于某种原因,这不起作用....无论如何,我猜是单独的问题。

仅供参考,我试图在此处总结所有这些错误处理内容(重点是 AJAX):http://outbottle.com/net-mvc-3-custom-ajax-error-handling-2/

谢谢

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 2016-08-04
    • 2011-11-29
    • 2018-04-06
    • 2016-02-07
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多