Return 从 MVC 操作过滤器到原始视图

Return to original view from MVC action filter

我正在 asp.net 核心网站上工作,我正在尝试使用过滤器进行一些全局验证异常处理。后端可以在随机位置抛出 fluentapi ValidationException,我想捕获这些并向用户显示错误消息。此过滤器只关心 ValidationExceptions。所有其他异常将在稍后处理..

我不想在所有控制器的每个 post 操作中使用 try/catch,而是想使用一个只捕获 ValidationExceptions 的过滤器,将错误添加到 ModelState,然后 return 使用更新后的 ModelState 到原始视图。

我尝试了很多方法,但每次在过滤器完成后我都得到一个空白页面。我可以使用上下文中的控制器和操作轻松设置新的 RedirectToRouteResult。但是后来我没有用户输入的 ModelState 和值..

public class PostExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        if (context.Exception is FluentValidation.ValidationException)
        {
            var ex = context.Exception as FluentValidation.ValidationException;
            context.Exception = null;
            context.HttpContext.Response.StatusCode = 200;
            context.ExceptionHandled = true;
            foreach (var item in ex.Errors.ToList())
            {
                context.ModelState.AddModelError(item.PropertyName, item.ErrorMessage);
            }

            // Done with the stuff I want.
            // Now please go back to the original view with the updated modelstate and values
        }
        else if (context.Exception is UnauthorizedAccessException)
        {
            // Do something else...
        }
        else
        {
            // Do something else...
        }
        base.OnException(context);
    }
}

您无法访问 Exception Filters 中的特定 Model(与操作方法相关)。因此,如果要将 Errors 添加到模型,则必须在 Controller 级别处理错误。

try
{
    //Do something
}
Catch(Exception e)
{
    ModelState.AddModelError(string key, string errorMessage);
    Return View(model)
}

错误消息将出现在 View

<%: Html.ValidationSummary() %>

如果没有 try-catch 块,您将不知道 exception 是否发生在操作方法中,以便您可以将自定义错误添加到模型中。