【发布时间】:2012-06-13 10:34:59
【问题描述】:
我在 MVC3 应用程序中的自定义错误部分中使用了 HandleErrorAttribute 和自定义错误控制器的组合来处理错误。逻辑是通过 HandleErrorAttribute 中的 OnException 处理程序处理任何 Ajax 请求错误,并通过 ErrorController 处理其余错误。下面是代码-
// Handle any ajax error via HandleErrorAttribute
public class HandleAjaxErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
public override void OnException(System.Web.Mvc.ExceptionContext filterContext)
{
filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
var exception = filterContext.Exception;
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
//some logic
filterContext.ExceptionHandled = true;
}
}
}
//Handle remaining errors in the Error Controller
public class ErrorController : Controller
{
protected override void HandleUnknownAction(string actionName)
{
var exception = Server.GetLastError(); //Can't get the exception object here.
//some logic
}
}
Web.config 设置:
<customErrors mode="On" defaultRedirect="~/Error">
</customErrors>
当任何非 ajax 异常发生时,控制从 OnException 块流向错误控制器中的 HandleUnknownAction。但是我无法获取 Exception 对象。如何在错误控制器中获取异常对象?
另外,您认为这两个步骤的方法是处理 MVC3 中错误的正确方法吗?我曾想过使用 Application_Error 事件处理程序在集中位置处理错误,但根据我的研究,这不是 MVC 应用程序的推荐方法。
【问题讨论】:
-
为什么不像处理 Ajax 一样简单地处理其他错误?我的意思是,如果是 Ajax 做某事,如果不是,调用视图并给它异常对象(这就是我在 MVC 项目中所做的)。您需要意识到 CustomErrors 只是重定向到给定的 url 并将导致错误的 Url 发送给它。但是,它不存储任何信息,它只是一个 url 重定向。
-
HandleErrorAttribute 无法处理 MVC 管道之外的错误(404、403 等),因此我仍然需要 CustomErrors 并且需要通过 Action 调用它,而不是直接调用 View。此外,我不想在 OnException 处理程序中硬编码视图名称。除了在一个地方处理所有错误更好。
-
@OmerAmsel,如果你能发布一些代码会很有帮助。
标签: asp.net-mvc-3 custom-errors onexception