2017-09-24 1 views
1

て失敗しました。ASP.NETコアのデシリアライズを知る方法はのは、このコードを想定してみましょうミドルウェア

コードが実行される前にこれをキャッチする方法はありますか?すべてのAPIメソッドでnullをテストする必要はありませんか?

私はミドルウェアとして実行可能かもしれないと思っていましたが、私はそれについての経験がないので、わかりません。

+0

モデルデータを検証する必要があります。プロパティが必要な場合は、それらをマークする必要があり、検証プロセス( 'ModelState.IsValid')が正しいかどうかを教えてくれます。 – poke

+0

しかし、それはすべての呼び出しに "if(ModelState.IsValid)..."を追加する必要があることを意味します。私はパイプラインでそれをキャッチして、単一の場所から一般的なエラーを返すことができるかどうかを見つけようとしています。 – Thomas

答えて

1

アクションが実行されたときに、MVCフィルタを使用して自動的に検証を実行できます。 the documentationを引用すると:

をあなたは自動的にモデル状態を検証し、状態が無効である場合にエラーを返すようにアクションフィルタを使用することができます。

using Microsoft.AspNetCore.Mvc; 
using Microsoft.AspNetCore.Mvc.Filters; 

namespace FiltersSample.Filters 
{ 
    public class ValidateModelAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext context) 
     { 
      if (!context.ModelState.IsValid) 
      { 
       context.Result = new BadRequestObjectResult(context.ModelState); 
      } 
     } 
    } 
} 

OnActionExecutedメソッドがアクションメソッドの後に実行され、見ることができアクションの結果をActionExecutedContext.Resultプロパティで操作します。 ActionExecutedContext.Canceledは、アクションの実行が別のフィルタによって短絡された場合はtrueに設定されます。 ActionExecutedContext.Exceptionは、アクションまたは後続のアクション・フィルターが例外をスローした場合に、非NULL値に設定されます。 ActionExecutedContext.Exceptionをヌルに設定すると、例外を効果的に '処理'し、ActionExectedContext.Resultは、アクションメソッドから正常に返されたかのように実行されます。

+0

実際には期待どおりに動作しません。私たちはいろいろな意味で使うことができるフレームワークを持っているので、私は完全に自動で、新しい休息を書く人は考えなくてもいい何かを探しています。 – Thomas

+0

@Thomasコントローラを装飾して、すべてのメソッドに適用することもできます。あるいは、[AddMvc'呼び出しでフィルタをグローバルに設定することもできます(https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters#filter-scopes-and-order-of-すべてのルートに適用されるようにします。 – poke

+0

私は前にその呼び出しを見ませんでした!完璧!もう一度、ありがとう! – Thomas

関連する問題