私はこのコードを持っています。
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
値はnullになります。だから今のところ私は最初のアプローチを使用します。もう少し時間があれば、2番目のアプローチを修正しようとします。