2016-08-04 2 views
1

Fluent Validationをモデルに使用しており、Swaggerを使用してフィールドと検証をマップしようとしています。私は次の検証流暢検証して設定したスワッガーはネストされたオブジェクトのFluent Validationを認識しません

public abstract class PersonModel 
{ 
    protected PersonModel() 
    { 
     DetailModel = new DetailModel(); 
    } 

    public DetailModel Details { get; set; } 
} 

public class CustomerModel : PersonModel 
{ 
    public DateTime DateJoined { get; set; } 
} 

public class DetailModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class CustomerModelValidator : AbstractValidator<CustomerModel> 
{ 
    public CustomerModelValidator() 
    { 
     RuleFor(x => x.DetailModel.FirstName) 
      .NotEmpty().WithMessage("FirstName is required"); 

     RuleFor(x => x.DateJoined) 
      .NotEmpty().WithMessage("DateJoined is required"); 
    } 
} 

は、私が参照として本ウェブサイトを使用し、闊歩は流暢検証を理解するには:

私は、次のモデルを持っている http://blog.yeticode.co.uk/2015/10/add-fluentvalidation-rules-to-swagger.html

スワッガーが新しい検証を理解できるようにするには、下の行が魔法を実行します:

schema.required.Add("DateJoined"); 

しかし、SwaggerはFirstNameなどの子の検証を理解していません。この場合、フィールド[Required]の上にデータアノテーションを使用すると、Swaggerはそれを正しく識別します。

このブログで提供されるソリューションの問題は、変数スキーマにDetailModelフィールドへのナビゲーションが含まれていないことです。 DetailModelの定義のみが含まれています。

FirstNameはスキーマに記載されていないため、必須フィールドに追加することはできません。

誰かがそれを行うことができましたか?

答えて

0

闊歩は、 "ネストされた" モデルを理解していないので - あなたのモデルがフラットにする:

public class CustomerModel : PersonModel 
{ 
    public DateTime DateJoined { get; set; } 
} 

public abstract class PersonModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

P.S.をthis codeが闊歩してFluentValidation作品を作る唯一のものである場合

は - それは検証の実装のためのより多くの機能を持っているので、私は強く、あなたが代わりにDataAnnotationsを使用することをお勧めします。

+0

私は、ブログ投稿からの読み上げを容易にする方法として、 'schema.required.Add(" DateJoined ");という行だけを述べました。バリデーションは既に行われており、この行ではSwaggerがDateJoinedが必要であることを認識させるだけです。私が持っている問題は、入れ子オブジェクトです。 –

+0

@GustavoMichel私はあなたを誤解しました。 "Details.FirstName"、 "Details.LastName"というキーをコードに手動で追加しようとしましたか?それ以降の検証は機能しますか? –

+0

はい、私はそれを試しましたが、 'Details.FirstName'と' Details.LastName'が 'schema.properties'フィールドのリストにないので動作しませんでした。そのリストには「Details」だけがあります。この検証は、FluentValidationでうまくいきます。私の唯一の問題は、Swaggerが必須フィールドとして認識していることです。 –

関連する問題