2016-08-04 214 views
1

我對我的模型使用Fluent驗證,並嘗試使用Swagger來映射字段和驗證。Swagger無法識別嵌套對象的Fluent驗證

我有以下型號:

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

爲了讓Swagger瞭解新的驗證,下面這行代表神奇:

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; } 
} 

附:

如果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將其視爲必填字段。 –