Asp.net mvc 3 使用自定义错误控制器和HandleErrorAttribute的两步MVC 3错误处理
我在自定义错误部分使用HandleErrorAttribute和自定义错误控制器的组合来处理MVC3应用程序中的错误。逻辑是通过HandleErrorAttribute中的OneException处理程序处理任何Ajax请求错误,并通过ErrorController处理其余错误。下面是代码-Asp.net mvc 3 使用自定义错误控制器和HandleErrorAttribute的两步MVC 3错误处理,asp.net-mvc-3,custom-errors,onexception,Asp.net Mvc 3,Custom Errors,Onexception,我在自定义错误部分使用HandleErrorAttribute和自定义错误控制器的组合来处理MVC3应用程序中的错误。逻辑是通过HandleErrorAttribute中的OneException处理程序处理任何Ajax请求错误,并通过ErrorController处理其余错误。下面是代码- // Handle any ajax error via HandleErrorAttribute public class HandleAjaxErrorAttribute : System.Web.M
// 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异常时,控制从OneException块流向错误控制器中的HandleUnknownAction。但是,我无法获取异常对象。如何在错误控制器中获取异常对象
另外,您认为这两步方法是处理MVC3中错误的正确方法吗?我曾想过使用应用程序错误事件处理程序在一个集中的位置处理错误,但根据我的研究,这不是MVC应用程序推荐的方法。关于我上面的评论,我在这里粘贴代码是为了澄清我做了什么 此代码位于BaseController内部(强烈建议创建一个BaseController,请参阅本文:) 我已经重写了OneException方法(我在这里的主要目标是区分Ajax调用和常规调用):
关于我上面的评论,需要注意的重要一点是,我并不是说不要使用CustomError,而是只有在发生管道之外的错误时才考虑它(例如401)。我可能错了,但我相信您不必担心控制器中的错误信息,因为MVC会自动将其连接到视图中。因此,如果您将(剃刀)视图设置为这样,它应该可以工作:
@model System.Web.Mvc.HandleErrorInfo
任何日志记录都可以在属性中完成,但如果需要在错误控制器中完成,请在错误控制器上创建一个LogError操作,该操作采用HandleErrorInfo参数,并将其称为:
@RenderAction(“LogError”,Model)
PS我还没有测试过这个,但它应该可以工作。我的错误消息没有显示出来,错误控制器也没有启动,直到我做了以下设置
<customErrors mode="On" defaultRedirect="~/Error">
</customErrors>
为什么不像使用Ajax一样直接处理其他错误?我的意思是,如果是Ajax,做点什么,如果不是,调用视图并给它一个exception对象(这就是我在MVC项目中所做的)。您需要意识到CustomErrors只是重定向到给定的url,并将导致错误的url发送给它。但是,它不存储任何信息,只是一个url重定向。HandleErrorAttribute无法处理MVC管道之外的错误(404403等),因此我仍然需要CustomErrors,需要通过操作调用它,而不是直接调用视图。另外,我不想在OneException处理程序中硬编码视图名称。除了将所有错误处理放在一个地方更好之外,如果您可以发布一些代码,这将非常有帮助。
<customErrors mode="On" defaultRedirect="~/Error">
</customErrors>