我有这个代码。
public ActionResult Index()
{
ReceiptModel model = new ReceiptModel();
try
{
model = new ReceiptModel(context);
}
catch (BussinessException bex)
{
ModelState.AddModelError("Index", bex.MessageToDisplay);
return View("Index");
}
return View(model);
}
BussinesException ir 从数据库返回,然后显示给用户。每个控制器方法都得加上try-catch语句,有点繁琐。有没有更简单的方法来处理这些异常?
PS所有其他异常都用HandleExceptionAttribute
更新:
我使用了 Floradu88 方法。所以现在我有这样的东西。
public sealed class HandleBussinessExceptionAttribute : HandleErrorAttribute, IExceptionFilter
{
public override void OnException(ExceptionContext filterContext)
{
filterContext.Controller.TempData["UnhandledException"] = filterContext.Exception;
filterContext.ExceptionHandled = true;
((Controller)filterContext.Controller).ModelState.AddModelError(
((BussinessException)filterContext.Exception).Code.ToString(),
((BussinessException)filterContext.Exception).MessageToDisplay
);
filterContext.Result = new ViewResult
{
ViewName = this.View,
TempData = filterContext.Controller.TempData,
ViewData = filterContext.Controller.ViewData,
};
}
}
在控制器动作上我放了
[HandleBussinessExceptionAttribute(Order = 2, ExceptionType = typeof(BussinessException), View = "Login")]
我也尝试过异常处理程序:
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(filterContext.RouteData));
然后处理行动中的错误,ModelState.IsValid
但行动的价值为空。所以现在我使用第一种方法。当我有更多时间时,我会尝试修复第二种方法。