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

您不能使用異常過濾器將異常轉化爲成功。但是你可以傳遞你需要的數據。我編輯了答案。 –