Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ASP.NET MVC 3异常是';处理';两次?_C#_Asp.net Mvc 3_Exception Handling - Fatal编程技术网

C# 为什么ASP.NET MVC 3异常是';处理';两次?

C# 为什么ASP.NET MVC 3异常是';处理';两次?,c#,asp.net-mvc-3,exception-handling,C#,Asp.net Mvc 3,Exception Handling,我已经使用下面的代码实现了异常处理。[编辑开始]我不知道为什么它会调用view两次。[已编辑完毕] 基站控制器 public class BaseController : Controller { protected override void OnException(ExceptionContext filterContext) { if (filterContext.HttpContext.IsCustomErrorEnable

我已经使用下面的代码实现了异常处理。[编辑开始]我不知道为什么它会调用view两次。[已编辑完毕]

基站控制器

public class BaseController : Controller
    {
        protected override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.HttpContext.IsCustomErrorEnabled)
            {
                filterContext.ExceptionHandled = true;

                if (filterContext.Exception.GetType() == typeof(ArgumentOutOfRangeException))
                {
                    this.View("OutOfRange").ExecuteResult(this.ControllerContext);
                }
                else
                {
                    this.View("Error").ExecuteResult(this.ControllerContext);
                }
            }

            base.OnException(filterContext);
        }
    }
家庭控制器

public class HomeController : BaseController
{
        public ActionResult Exception2()
        {
            throw (new ArgumentOutOfRangeException());
        }

        public ActionResult Exception3()
        {
            throw (new Exception());
        }
}
错误视图(仅限共享文件夹)

@model System.Web.Mvc.HandleErrorInfo
@{
布局=空;
}
错误
很抱歉,处理您的请求时出错。
@如果(型号!=null)
{
@Model.Exception.GetType().Name
抛出@Model.ControllerName@Model.ActionName


@模型.异常 }
OutOfRange视图(仅限共享文件夹)

@{
布局=空;
}
超出范围异常
@如果(型号!=null)
{
@Model.Exception.GetType().Name
抛出@Model.ControllerName@Model.ActionName


@模型.异常 }
执行URL:
http://[domainName]/Home/Exception2

在这里,它工作得很好。[已编辑:此处也会调用两次。]

执行URL:
http://[domainName]/Home/Exception3

在这里,它工作不正常。您可以看到“对不起,在处理您的请求时发生了错误。”将出现两次。当我使用上面的URL调试应用程序时,错误视图调用了两次(第一次模型为null,第二次模型包含一些值)。我可以知道我的实现有什么问题吗? 添加
base.OnException(filterContext)之前
if(filterContext.HttpContext.IsCustomErrorEnabled)

尝试的事项:

  • global.asax
    中删除默认的
    HandleError
    全局操作筛选器属性(如果存在)。创建新的ASP.NET MVC 3应用程序时,默认模板会在
    RegisterGlobalFilters
    方法中注册它。因此,注释掉注册该属性的行
  • 在web.config中启用自定义错误:

    <customErrors mode="On" />
    

    我也遇到了同样的问题,但我通过添加以下内容解决了错误:

    Response.End();
    
    到我的OneException方法的末尾


    我知道这不是理想的解决方案,但它至少让我摆脱了束缚,直到我可以研究一个更完整的选项。

    第二视图中缺少@model指令。@columbo。不适用于我。请发布控制器方法以查找错误view@Colombo . 当我们使用HandleErrorAttribute时,无需为错误视图编写任何单个控制器方法。如果尚未执行此操作,请尝试清理并重新生成解决方案。我建议您查看一下ELMAH,了解ASP.NET/MVC3的错误日志记录。祝你好运我将尝试您的解决方案并让您知道输出。如果我删除HandleError,HandleErrorInfo模型将为空:(.嗯,这是绝对正常的。我看不到你在自定义的
    OnException
    方法中传递任何模型。你只需渲染视图。如果你希望在视图中获得一些模型,你需要向该视图传递一个模型。Hmmm.我如何在视图中获得HandleErrorInfo?我是在OnException覆盖方法中获得该对象的吗?你就像我的教父。它是works!!!我从你的帖子/博客中学到了很多东西。非常感谢!!!只是为了了解这些知识。当我在global.asax文件中使用以下代码注册HandleErrorAttribute时。过滤器。添加(新HandleErrorAttribute{ExceptionType=typeof(ArgumentOutOfRangeException),View=“OutOfRange”,Order=2});我在共享文件夹中定义了OutOfrange视图,但它在“主”视图文件夹中查看。为什么会这样?
          protected override void OnException(ExceptionContext filterContext)
          {
              base.OnException(filterContext);
             if (filterContext.HttpContext.IsCustomErrorEnabled)
    
          }
    
    <customErrors mode="On" />
    
    else
    {
        string controllerName = filterContext.RouteData.GetRequiredString("controller");
        string actionName = filterContext.RouteData.GetRequiredString("action");
        var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
        var result = new ViewResult
        {
            ViewName = "Error",
            ViewData = new ViewDataDictionary<HandleErrorInfo>(model)
        };
        filterContext.Result = result;
    }
    
    Response.End();