2016-08-04 3 views
1

Ich verwende Fluent Validation für meine Modelle und ich versuche, die Felder und Validierung mit Swagger abzubilden.Swagger erkennt Fluent Validierung von verschachtelten Objekten nicht

Ich habe folgendes Modell:

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

Ich habe die folgende Validierung mit Fluent Validierung gesetzt:

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

Um Swagger verstehen Fluent Validation, habe ich diese Seite als Referenz: http://blog.yeticode.co.uk/2015/10/add-fluentvalidation-rules-to-swagger.html

Um Swagger neue Validierungen zu verstehen, macht die folgende Zeile die Magie:

schema.required.Add("DateJoined"); 

Swagger versteht jedoch keine Kindvalidierung wie FirstName. Wenn ich in diesem Fall eine Datenannotation oben auf dem Feld [Required] verwende, identifiziert Swagger sie korrekt.

Das Problem mit der von diesem Blog bereitgestellten Lösung ist die Variable Schema enthält nicht die Navigation zu DetailModel Felder. Es enthält nur die Definition für DetailModel.

Aber da nicht im Schema aufgeführt ist, kann ich es nicht zu den erforderlichen Feldern hinzufügen.

Hat es jemand geschafft, das zu tun?

Antwort

0

Da Swagger nicht "verschachtelte" Modelle verstehen - machen Sie Ihr Modell Wohnung:

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.

Wenn this code ist die einzige Sache, die FluentValidation Arbeit in Swagger macht - ich empfehlen Sie DataAnnotations stattdessen zu verwenden, weil es viel mehr Funktionen zur Validierung Implementierung haben.

+0

Ich erwähnte nur die Zeile 'schema.required.Add (" DateJoined ");' als eine Möglichkeit, das Lesen aus dem Blogpost zu erleichtern. Die Validierung ist bereits vorhanden und diese Zeile lässt Swagger nur erkennen, dass DateJoined erforderlich ist. Das Problem, das ich habe, ist mit verschachtelten Objekten. –

+0

@GustavoMichel Ich habe dich missverstanden. Haben Sie versucht, die Schlüssel "Details.FirstName", "Details.LastName" manuell im Code hinzuzufügen? Funktioniert die Validierung danach? –

+0

Ja, ich habe das versucht, aber es hat nicht funktioniert, weil 'Details.FirstName' und' Details.LastName' nicht in der Liste der Felder 'schema.properties' enthalten sind. Nur 'Details' sind in dieser Liste. Die Validierung funktioniert gut mit FluentValidation. Mein einziges Problem ist, dass Swagger es als Pflichtfeld erkennt. –

Verwandte Themen