0

Я использую ASP.NET Core и FluentValidation.Ошибка проверки правильности в фильтре исключений и визуализация вида

Когда действие POST получает недопустимый ввод, это принято пересборку вид входной формы, с ошибками проверки:

if (!ModelState.IsValid) 
    return View("nameOfViewRenderedByGetAction", model); 

Но моя проверка фактически выполняется в службе, по FluentValidation, который бросает ValidationException , Я хочу обработать его в фильтре исключений:

public class ValidationFilterAttribute : ActionFilterAttribute, IExceptionFilter 
{ 

    public void OnException(ExceptionContext context) 
    { 
     // only handle ValidationException 
     var ex = context.Exception as ValidationException; 
     if (ex == null) return; 

     // re-render get action's view, or redirect to get action 
     // ?? 
    } 

} 

Я застрял на "??" потому что Core изменил подписи многих типов, и ExceptionContext не обрабатывает данные, необходимые для выполнения этой работы.

Как это сделать?

ответ

1

Из фильтра исключений Вы можете отобразить пользовательский вид, установив результат контекста.

public class ValidationFilterAttribute : ActionFilterAttribute, IExceptionFilter 
{ 

    public void OnException(ExceptionContext context) 
    { 
     // only handle ValidationException 
     var ex = context.Exception as ValidationException; 
     if (ex == null) return; 

     // re-render get action's view, or redirect to get action 
     var result = new ViewResult { ViewName = "GetView" } 
     context.HttpContext.Response.Clear(); 
     context.Result = result; 
    } 

} 

Где GetView должна быть имя зрения прибудет действия пользователя.

Образец фильтра исключений, который использует собственное представление ошибки разработчиков для отображения сведений об исключениях.

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    private readonly IHostingEnvironment _hostingEnvironment; 
    private readonly IModelMetadataProvider _modelMetadataProvider; 

    public CustomExceptionFilterAttribute(
     IHostingEnvironment hostingEnvironment, 
     IModelMetadataProvider modelMetadataProvider) 
    { 
     _hostingEnvironment = hostingEnvironment; 
     _modelMetadataProvider = modelMetadataProvider; 
    } 

    public override void OnException(ExceptionContext context) 
    { 
     if (!_hostingEnvironment.IsDevelopment()) 
     { 
      // do nothing 
      return; 
     } 
     var result = new ViewResult {ViewName = "CustomError"}; 
     result.ViewData = new ViewDataDictionary(_modelMetadataProvider,context.ModelState); 
     result.ViewData.Add("Exception", context.Exception); 
     // TODO: Pass additional detailed data via ViewData 
     context.Result = result; 
    } 
} 

Обратите внимание, что приведенный выше код отправляет контекст, состояние модели и исключение в представление.

В случае все, что вам нужно, это персонализированная страница ошибки обратитесь к ASP.NET Core Error Handling

Как правило, вы не должны использовать фильтр исключений, чтобы превратить ошибку в успех. Рассмотрите возможность использования фильтра действий, если у вас есть такое требование. Сказав, что, по какой-то причине, если вы по-прежнему необходимо перенаправить из фильтра исключения, это то, как это может быть сделано

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute 
    { 
     private readonly IHostingEnvironment _hostingEnvironment; 

     public CustomExceptionFilterAttribute(
      IHostingEnvironment hostingEnvironment, 
      IModelMetadataProvider modelMetadataProvider) 
     { 
      _hostingEnvironment = hostingEnvironment; 
     } 

     public override void OnException(ExceptionContext context) 
     { 
      if (!_hostingEnvironment.IsDevelopment()) 
      { 
       // do nothing 
       return; 
      } 

      var result = new RedirectToRouteResult(
new RouteValueDictionary(new { controller = "Home", action = "Error" })); 
      context.Result = result; 
     } 
    } 
+0

Это делает, что конкретный вид, а не перенаправлять. И он отображает без ошибок проверки, так что информация теряется. – grokky

+0

Вы не можете использовать фильтр исключений, чтобы превратить исключение в успех. Однако вы можете передать нужные данные. Я отредактировал ответ. –