gpt4 book ai didi

c# - 为什么 ASP.NET MVC 3 异常是 'handled' 两次?

转载 作者:行者123 更新时间:2023-11-30 13:48:49 28 4
gpt4 key购买 nike

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

基地 Controller

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);
}
}

家庭 Controller

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

public ActionResult Exception3()
{
throw (new Exception());
}
}

错误 View (仅限共享文件夹)

@model System.Web.Mvc.HandleErrorInfo
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
</head>
<body>
<h2>
Sorry, an error occurred while processing your request.
</h2>
<h3>
@if (Model != null)
{
<p>@Model.Exception.GetType().Name<br />
thrown in @Model.ControllerName @Model.ActionName</p>
<br />
@Model.Exception
}
</h3>
</body>
</html>

OutOfRange View (仅限共享文件夹)

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>OutOfRange Exception</title>
</head>
<body>
<div>
<h3>
@if (Model != null)
{
<p>@Model.Exception.GetType().Name<br />
thrown in @Model.ControllerName @Model.ActionName</p>
<br />
@Model.Exception
}
</h3>
</div>
</body>
</html>

执行网址:http://[domainName]/Home/Exception2

这里它工作正常。 [编辑:这里它也调用了两次。]

enter image description here

执行网址:http://[domainName]/Home/Exception3

这里不能正常工作。您可以看到“抱歉,处理您的请求时发生错误。”来了两次。当我使用上面的 URL 调试应用程序时,错误 View 调用了两次(第一次模型为空,第二次模型包含一些值)。我可以知道我的实现有什么问题吗? enter image description here

最佳答案

要尝试的事情:

  1. Global.asax 中删除默认的 HandleError 全局操作过滤器属性(如果存在)。当您创建新的 ASP.NET MVC 3 应用程序时,默认模板会在 RegisterGlobalFilters 方法中注册它。所以注释掉注册这个属性的行。
  2. 在您的 web.config 中启用自定义错误:

    <customErrors mode="On" />

更新:

如果您想将模型传递给 Error.cshtml View (因为它是 HandleErrorInfo 的强类型),您可以执行以下操作:

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;
}

关于c# - 为什么 ASP.NET MVC 3 异常是 'handled' 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11309635/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com