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

时间:2019-06-19 11:01:30

标签: asp.net-mvc asp.net-core exceptionfilterattribute

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

我想使用一个仅捕获ValidationExceptions的过滤器,而不是在所有控制器中的每个post操作中都使用try / catch,而是将错误添加到ModelState,然后使用更新的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);
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

错误消息将显示在您的<%: Html.ValidationSummary() %>中的View

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