Fluent Validation List集合嵌套验证失效问题求助
Fluent Validation集合嵌套验证失效问题
- 已按官方文档配置
OrderForCreationVm中List<AddressForCreationVm>的RuleForEach验证,但嵌套的AddressForCreationValidator未生效 - 单独验证
AddressForCreationVm时,所有验证规则正常工作
项目完整代码托管在GitHub仓库。
OrderForCreationVm及验证器代码
using AutoMapper;using AutoMapper.Configuration.Annotations;using CafeMVC.Application.Interfaces.Mapping;using CafeMVC.Application.ViewModels.Customer;using CafeMVC.Application.ViewModels.Products;using FluentValidation;using System;using System.Collections.Generic;using System.Linq; namespace CafeMVC.Application.ViewModels.Orders { [AutoMap(typeof(CafeMVC.Domain.Model.Order))] public class OrderForCreationVm : IMapFrom<CafeMVC.Domain.Model.Order> { [Ignore] public List<AddressForCreationVm> Addresses { get; set; } public void Mapping(Profile profile) { profile.CreateMap<CafeMVC.Domain.Model.Order, OrderForCreationVm>().ReverseMap() .ForMember(d => d.OrderedProductsDetails, s => s.MapFrom(opt => opt.Products)); } } public class OrderForCreationValidator : AbstractValidator<OrderForCreationVm> { public OrderForCreationValidator() { RuleFor(x => x.Id).NotNull(); RuleForEach(x => x.Addresses).SetValidator(new AddressForCreationValidator()); } } }
AddressForCreationVm及验证器代码
using AutoMapper;using CafeMVC.Application.Interfaces.Mapping;using FluentValidation;using System;using System.Collections.Generic;using System.Linq; namespace CafeMVC.Application.ViewModels.Customer { public class AddressForCreationVm : IMapFrom<CafeMVC.Domain.Model.Address> { public int Id { get; set; } public string BuildingNumber { get; set; } public int FlatNumber { get; set; } public string Street { get; set; } public string City { get; set; } public string ZipCode { get; set; } public string Country { get; set; } public int CustomerId { get; set; } public int AddressTypeId { get; set; } public List<AddressTypeVm> AllAddressTypes { get; set; } public string Btn { get; set; } public void Mapping(Profile profile) { profile.CreateMap<AddressForCreationVm, CafeMVC.Domain.Model.Address>().ReverseMap(); } } public class AddressForCreationValidator : AbstractValidator<AddressForCreationVm> { public AddressForCreationValidator() { string[] availableZipcodes = new string[] { "LE1 ", "LE2", "LE3", "LE4" }; RuleFor(x => x.Id).NotNull(); RuleFor(x => x.AddressTypeId).NotNull(); RuleFor(x => x.BuildingNumber).NotEmpty().MaximumLength(255); RuleFor(x => x.ZipCode).NotEmpty().Must(x => availableZipcodes.Any(prefix => x.StartsWith(prefix))).Length(7).When(x => x.AddressTypeId == 2); RuleFor(x => x.City).Equal("Leicester").When(x => x.AddressTypeId == 2); RuleFor(x => x.Country).MaximumLength(255).NotEmpty(); } } }
单元测试代码
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using CafeMVC.Application.ViewModels.Customer;using CafeMVC.Application.ViewModels.Orders;using CafeMVC.Domain.Model;using FluentValidation;using FluentValidation.TestHelper;using Xunit; namespace CafeMVC.Tests.FluentValidationTests { [Theory] [InlineData("LE12 7EH")] [InlineData("LE5 7EH")] public void AddressForCreationValidatorUnderOrderShowErrorWIthWrongZipCode(string zipCode) { //Arrange OrderForCreationValidator validator = new(); OrderForCreationVm order = new() { Addresses = new() { GetAddressForTests() } }; order.Addresses[0].ZipCode = zipCode; //Act var result = validator.TestValidate(order); //Assert result.ShouldHaveValidationErrorFor(x => x.Addresses[0].ZipCode); } } }
测试结果
- 针对ZipCode规则的单元测试失败,截图如下:

- 已尝试调整验证器规则写法,排查相关技术案例,问题仍未解决
内容的提问来源于stack exchange,提问作者Kryspin Trawnik
相关产品推荐
相关产品推荐

