我正在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);
}
}
答案 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
是否在操作方法中出现,以便可以向模型添加自定义错误。