2017-08-18 24 views
0

こんにちは.NET Coreを使用してWebApiのカスタム検証応答を取得しようとしています。ここで流暢な検証でカスタム検証応答を使用する

私はバリデータクラスを持っており、現在、我々だけで検証エラーのためModalState.IsValidをチェックし、BadRequestようにModelStateオブジェクトに渡す

[{ 
    ErrorCode: 
    ErrorField: 
    ErrorMsg: 
}] 

のような応答モデルを持っていると思います。

しかし、新しい要件では、検証の失敗ごとにErrorCodeが必要です。

マイサンプルバリデータクラス

public class TestModelValidator : AbstractValidator<TestModel>{ 

public TestModelValidator { 
    RuleFor(x=> x.Name).NotEmpty().WithErrorCode("1001"); 
    RuleFor(x=> x.Age).NotEmpty().WithErrorCode("1002"); 
    } 
} 

私は、検証結果に

OPT1得るために、自分の行動に類似したものを使用することができます。

var validator = new TestModelValidator(); 
    var result = validator.Validate(inputObj); 
    var errorList = result.Error; 

を、私のcustomnレスポンスオブジェクトにValidationResultを操作します。 または
OPT2:

I can use [CustomizeValidator] attribute and maybe an Interceptors. 

が、OPT2のために、私はコントローラのアクションにインターセプタからValidationResultを取得する方法を知りません。

すべてのコントローラアクションメソッドでOpt1を呼び出して検証するのを避けるため、共通のメソッドを記述します。

リソースを修正するように要求してください。

答えて

0

は答えを、このリンクを参照してください:https://github.com/JeremySkinner/FluentValidation/issues/548

ソリューション:

私はIValidatorInterceptorとAbstractValidatorの両方を継承しbasevalidatorクラスを作成している行って。 afterMvcvalidationメソッドで検証が成功しなかった場合は、validationResultからカスタム応答オブジェクトにエラーをマップし、カスタム例外をスローします。

私は私の例外処理ミドルウェアと返信応答をキャッチします。私は、JSONのデシリアライズが結合モデル中に失敗し、エラーの詳細がにModelStateに保存されますときmodelstate.IsValidがfalseに設定されます参照

:コントローラがnullオブジェクトを取得シリアル化問題で

。 [私に起こっていることは何ですか]

また、この失敗のために、逆シリアル化が停止し、コントローラメソッドでnullオブジェクトが取得されます。

現在、私はserialize errorcontext.Handled = trueを手動で設定し、fluentvalidationで無効な入力をキャッチできるようにしています。

https://www.newtonsoft.com/json/help/html/SerializationErrorHandling.htm [私の要求モデルでOnErrorAttributeを定義しました]。

私はより良い解決策を探していますが、今のところこのハックは仕事をしています。

関連する問題