C# 为什么ASP.NET MVC 3异常是';处理';两次?
我已经使用下面的代码实现了异常处理。[编辑开始]我不知道为什么它会调用view两次。[已编辑完毕] 基站控制器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
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();