我认为最干净的解决方案是像这样使用 ActionFilterAttribute :
public class RedirectErrorAttribute : ActionFilterAttribute
{
#region Methods & Function
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.Controller.TempData.ContainsKey("modelErrors"))
{
foreach (var errors in (Dictionary<string, List<string>>)filterContext.Controller.TempData["modelErrors"])
foreach (var error in errors.Value)
filterContext.Controller.ViewData.ModelState.AddModelError(errors.Key, error);
}
base.OnActionExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (filterContext.Controller.ViewData.ModelState.Values.Any(x => x.Errors.Count > 0))
{
if (filterContext.Controller.TempData.ContainsKey("modelErrors"))
filterContext.Controller.TempData.Remove("modelErrors");
else
{
filterContext.Controller.TempData["modelErrors"] =
filterContext.Controller.ViewData.ModelState.
Where(item => item.Value.Errors.Count > 0).
ToDictionary(
item => item.Key,
item => item.Value.Errors.Select(error => error.ErrorMessage).ToList()
);
filterContext.Controller.TempData.Keep("modelErrors");
}
}
base.OnResultExecuted(filterContext);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
}
#endregion
}
在您只需将属性放在引发错误的操作和收到错误的操作的顶部之后,如下所示:
[RedirectError]
public ActionResult Delete(Guid id)
{
[RedirectError]
public ActionResult Get(Guid id)
{
这就像一个具有干净可管理代码的魅力。
希望这个帮助!
朱利安