2016-08-04 7 views
1

Я использую Fluent Validation для своих моделей, и я стараюсь отображать поля и проверять с помощью 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; } 
} 

У меня есть следующие проверки набор с Fluent Validation:

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

Чтобы сделать Кураж понять Fluent Validation, я использовал этот сайт в качестве ссылки: http://blog.yeticode.co.uk/2015/10/add-fluentvalidation-rules-to-swagger.html

Чтобы Swagger понимал новые валидации, линия ниже делает магию:

schema.required.Add("DateJoined"); 

Однако, Swagger не понимает проверку ребенка, такую ​​как FirstName. Если в этом случае я использую аннотацию данных в верхней части поля [Required], Swagger правильно ее идентифицирует.

Проблема с решением, представленным в этом блоге, является переменной Schema, которая не содержит навигации к полям DetailModel. Он содержит только определение для DetailModel.

Но так как FirstName не указан в схеме, я не могу добавить его в обязательные поля.

Неужели это кому-то удалось?

ответ

0

Поскольку Swagger не понимает "вложенная" модели - сделать вашу модель плоским:

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 работы в Swagger - я настоятельно рекомендую вам использовать DataAnnotations вместо этого, потому что он имеет гораздо больше возможностей для осуществления проверки.

+0

Я упомянул только строку 'schema.required.Add (« DateJoined »);' как способ облегчить чтение из сообщения в блоге. Валидация уже установлена, и эта строка только заставляет Swagger признать, что DateJoined требуется. Проблема, с которой я сталкиваюсь, связана с вложенными объектами. –

+0

@GustavoMichel Я вас неправильно понял. Вы пытались добавить ключи «Details.FirstName», «Details.LastName» вручную в код? После этого работает валидация? –

+0

Да, я пробовал это, но это не сработало, потому что 'Details.FirstName' и' Details.LastName' не входят в список полей 'schema.properties'. В этом списке находится только 'Details'. Валидация отлично работает с FluentValidation. Моя единственная проблема заключается в том, что Swagger признает это как обязательное поле. –