0

私はASP.NET CoreとFluentValidationを使用しています。例外フィルタでハンドル検証に失敗し、ビューを再表示します

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

しかし、私の検証は、実際にValidationExceptionをスローFluentValidation、によって、サービスで実行されます。POSTアクションが無効な入力を受け取ると

、それは検証エラーと、入力フォームビューを再レンダリングすることが通例です。例外フィルタで処理したい:

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 
     // ?? 
    } 

} 

私は "??"コアは多くのタイプのシグネチャを変更しており、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は、Getアクションのビューの名前にする必要があります。

カスタム開発者エラービューを使用して例外の詳細を表示するサンプル例外フィルタ。

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

例外フィルタを使用して例外を成功にすることはできません。しかし、必要なデータを渡すことができます。私は答えを編集しました。 –

関連する問題