FluentValidation 未验证对象列表(在 SO 上尝试了其他解决方案)
FluentValidation not validating a list of objects (tried other solutions on SO)
我在 Whosebug 上尝试了多种解决方案,但是当我验证对象列表时没有触发验证。数据以以下形式出现,我使用 fluentvalidation
进行验证,例如:
public class Command : IRequest
{
public List<objectsCreateDto> objects { get; set; }
}
public class CommandValidator : AbstractValidator<Command>
{
public CommandValidator()
{
RuleForEach(x => x.objects).SetValidator(new objectsCreateDtoValidator());
}
}
我的objectsCreateDtoValidator
是:
public class objectsCreateDtoValidator : AbstractValidator<objectsCreateDto>
{
public objectsCreateDtoValidator()
{
RuleFor(x => x.Name).NotEmpty();
RuleFor(X => X.Identifier).NotEmpty();
RuleFor(x => x.UuId).NotEmpty();
}
}
这是我的 objectsCreateDto
class:
public class objectsCreateDto
{
public Guid UuId { get; set; }
public string Name { get; set; }
public string Identifier { get; set; }
}
这是我发送到 API 端点的 JSON:
[
{
"uuId": "00000000-0000-0000-0000-000000000000",
"name": "uuid test",
"identifier": "testing order identifier"
}
]
API 终点是:
[HttpPost]
public async Task<ActionResult<Unit>> Create(List<objectsCreateDto> objectsCreateDtos)
{
return await Mediator.Send(new Create.Command{objects = objectsCreateDtos});
}
两个验证都没有被触发。尝试了所有解决方案但没有奏效。如果我遗漏了什么,请善待。
PS:FluentValidation
在其他地方验证,而在这种情况下它不验证对象列表
您尝试验证的命令对象是否在其列表中包含任何 objectsCreateDto-items?如果没有,则什么都得不到验证。我试过你的代码,如果我向列表中添加一些对象,一切正常。
不知何故我做对了。
存在映射问题。在 API 端点的早期,它正在获取 list
并正在创建 Command
的实例。我把JSON改为Command
class的方式,让它自动映射到class,之后Validation就开始工作了。
所以我更改了 API 端点:
[HttpPost]
public async Task<ActionResult<Unit>> Create(List<objectsCreateDto> objectsCreateDtos)
{
return await Mediator.Send(new Create.Command{objects = objectsCreateDtos});
}
至:
public async Task<ActionResult<Unit>> Create(Create.Command command)
{
return await Mediator.Send(command);
}
已将 JSON 更改为:
{
"objects": [
{
"uuId": "00000000-0000-0000-0000-000000000000",
"identifier": "testing order identifier",
"name": "something"
},
{
"uuId": "00000000-0000-0000-0000-000000000000",
"identifier": "testing order identifier",
"name": "something"
},
{
"uuId": "00000000-0000-0000-0000-000000000000",
"identifier": "testing order identifier",
"name": "something"
}
]
}
我在 Whosebug 上尝试了多种解决方案,但是当我验证对象列表时没有触发验证。数据以以下形式出现,我使用 fluentvalidation
进行验证,例如:
public class Command : IRequest
{
public List<objectsCreateDto> objects { get; set; }
}
public class CommandValidator : AbstractValidator<Command>
{
public CommandValidator()
{
RuleForEach(x => x.objects).SetValidator(new objectsCreateDtoValidator());
}
}
我的objectsCreateDtoValidator
是:
public class objectsCreateDtoValidator : AbstractValidator<objectsCreateDto>
{
public objectsCreateDtoValidator()
{
RuleFor(x => x.Name).NotEmpty();
RuleFor(X => X.Identifier).NotEmpty();
RuleFor(x => x.UuId).NotEmpty();
}
}
这是我的 objectsCreateDto
class:
public class objectsCreateDto
{
public Guid UuId { get; set; }
public string Name { get; set; }
public string Identifier { get; set; }
}
这是我发送到 API 端点的 JSON:
[
{
"uuId": "00000000-0000-0000-0000-000000000000",
"name": "uuid test",
"identifier": "testing order identifier"
}
]
API 终点是:
[HttpPost]
public async Task<ActionResult<Unit>> Create(List<objectsCreateDto> objectsCreateDtos)
{
return await Mediator.Send(new Create.Command{objects = objectsCreateDtos});
}
两个验证都没有被触发。尝试了所有解决方案但没有奏效。如果我遗漏了什么,请善待。
PS:FluentValidation
在其他地方验证,而在这种情况下它不验证对象列表
您尝试验证的命令对象是否在其列表中包含任何 objectsCreateDto-items?如果没有,则什么都得不到验证。我试过你的代码,如果我向列表中添加一些对象,一切正常。
不知何故我做对了。
存在映射问题。在 API 端点的早期,它正在获取 list
并正在创建 Command
的实例。我把JSON改为Command
class的方式,让它自动映射到class,之后Validation就开始工作了。
所以我更改了 API 端点:
[HttpPost]
public async Task<ActionResult<Unit>> Create(List<objectsCreateDto> objectsCreateDtos)
{
return await Mediator.Send(new Create.Command{objects = objectsCreateDtos});
}
至:
public async Task<ActionResult<Unit>> Create(Create.Command command)
{
return await Mediator.Send(command);
}
已将 JSON 更改为:
{
"objects": [
{
"uuId": "00000000-0000-0000-0000-000000000000",
"identifier": "testing order identifier",
"name": "something"
},
{
"uuId": "00000000-0000-0000-0000-000000000000",
"identifier": "testing order identifier",
"name": "something"
},
{
"uuId": "00000000-0000-0000-0000-000000000000",
"identifier": "testing order identifier",
"name": "something"
}
]
}