You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:05:27