Я думаю, что наиболее чистым решением было использование 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)
{
И это работает как шарм с чистым управляемым кодом.
Надеюсь, эта помощь!
Julien