是否有一个好的方法来处理异常在MVC ChildActions
本文关键字:异常 MVC ChildActions 处理 有一个 方法 是否 | 更新日期: 2023-09-27 18:18:29
我似乎用Child Actions做了很多异常吞咽。
[ChildActionOnly]
[OutputCache(Duration = 1200, VaryByParam = "key;param")]
public ActionResult ChildPart(int key, string param)
{
try
{
var model = DoRiskyExceptionProneThing(key, param)
return View("_ChildPart", model);
}
catch (Exception ex)
{
// Log to elmah using a helper method
ErrorLog.LogError(ex, "Child Action Error ");
// return a pretty bit of HTML to avoid a whitescreen of death on the client
return View("_ChildActionOnlyError");
}
}
我觉得我在剪切和粘贴一堆代码,而我们都知道,每一次剪切和粘贴都是一只小猫被天使的眼泪淹死。
是否有更好的方法来管理异常的子操作,将允许屏幕的其余部分适当渲染?
你可以基于Mvc的HandleError属性创建一个CustomHandleError属性,覆盖OnException方法,做你的日志记录,并可能返回一个自定义视图。
public override void OnException(ExceptionContext filterContext)
{
// Log to elmah using a helper method
ErrorLog.LogError(filterContext.Exception, "Oh no!");
var controllerName = (string)filterContext.RouteData.Values["controller"];
var actionName = (string)filterContext.RouteData.Values["action"];
if (!filterContext.HttpContext.IsCustomErrorEnabled)
{
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
filterContext.Result = new ViewResult
{
ViewName = "_ChildActionOnlyError",
MasterName = Master,
ViewData = new ViewDataDictionary(model),
TempData = filterContext.Controller.TempData
};
return;
}
}
然后用这样的逻辑修饰任何你想要启用的控制器和/或动作,像这样:
[ChildActionOnly]
[OutputCache(Duration = 1200, VaryByParam = "key;param")]
[CustomHandleError]
public ActionResult ChildPart(int key, string param)
{
var model = DoRiskyExceptionProneThing(key, param)
return View("_ChildPart", model);
}