我正在为我的模型使用Fluent验证,我尝试使用Swagger映射字段和验证。
我有以下型号:
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验证设置了以下验证:
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");
}
}
为了让Swagger了解Fluent验证,我使用本网站作为参考: 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 :(得分: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 ,因为它具有更多功能验证实施。
答案 1 :(得分:0)
1.为每个班级创建验证器:
public class CustomerModelValidator : AbstractValidator<CustomerModel>
{
public CustomerModelValidator()
{
RuleFor(x => x.DateJoined)
.NotEmpty().WithMessage("DateJoined is required");
}
}
public class DetailModelValidator : AbstractValidator<DetailModel>
{
public DetailModelValidator()
{
RuleFor(x => x.FirstName)
.NotEmpty().WithMessage("FirstName is required");
}
}
用于集成fluentValidation和swagger use package https://www.nuget.org/packages/MicroElements.Swashbuckle.FluentValidation/
结果: screenshot