包装 DTO 的页面模型上的模型验证

Model validation on a page model wrapping a DTO

我使用 ASP.NET 核心 MVC 已经有一段时间了,现在我遇到了挫折。我已经使用 mediatR 和 automapper 使用 CQRS 实现了我的项目,但我似乎找不到正确的方法来验证我的页面模型。

我的设计基于将实体与页面分开。 commands/queries return 通常包装 DTO 的页面模型实现具有内联映射的配置文件以从实体映射到 DTO。

如何通过验证包装在页面模型中的 DTO 来使用验证并向页面显示错误消息?

现在,对于一些演示代码:

一个演示查询:

namespace HM.Application.Queries
{
    public class GetAllMedicsQuery : IRequest<MedicIndexModel> { }

    public class GetAllMedicsQueryHandler : IRequestHandler<GetAllMedicsQuery, MedicIndexModel>
    {
        private readonly IMedicRepository _medicRepository;
        private readonly IMapper _mapper;
        private readonly ILogger<GetAllMedicsQueryHandler> _logger;

        public GetAllMedicsQueryHandler(IMedicRepository medicRepository, IMapper mapper, ILogger<GetAllMedicsQueryHandler> logger)
        {
            _medicRepository = medicRepository;
            _mapper = mapper;
            _logger = logger;
        }

        public async Task<MedicIndexModel> Handle(GetAllMedicsQuery request, CancellationToken cancellationToken)
        {
            var medics = await _medicRepository.GetAllMedics();
            MedicIndexModel medicIndexModel = new MedicIndexModel()
            {
                Medics = _mapper.Map<IEnumerable<MedicIndexDTO>>(medics)
            };

            return medicIndexModel;
        }
    }
}

页面模型:

namespace HM.Application.ViewModels
{
    public class MedicIndexModel : PageModel
    {
        public IEnumerable<MedicIndexDTO> Medics { get; set; }
    }
}

以及 DTO:

namespace HM.DTO
{
    public class MedicIndexDTO : IHaveCustomMapping
    {
        public string id { get; set; }
        public string firstName { get; set; }
        public string lastName { get; set; }
        public string email { get; set; }
        public string rank { get; set; }

        public void CreateMappings(Profile configuration)
        {
            configuration.CreateMap<Medic, MedicIndexDTO>()
                .ForMember(medicDto => medicDto.id, options => options.MapFrom(medic => medic.Id))
                .ForMember(medicDto => medicDto.firstName, options => options.MapFrom(medic => medic.firstName))
                .ForMember(medicDto => medicDto.lastName, options => options.MapFrom(medic => medic.lastName))
                .ForMember(medicDto => medicDto.email, options => options.MapFrom(medic => medic.Email))
                .ForMember(medicDto => medicDto.rank, options => options.MapFrom(medic => medic.rank));
        }
    }
}

谢谢!

假设您有一个自定义页面模型,让它成为 MyCustomPageModel,它继承了 PageModel,并且它包含某种 DTO。此 DTO 包含一些具有属性验证或其他形式验证的属性。当用作页面模型时,验证仍将对 DTO 内的字段起作用,尽管它本身不继承 PageModel。放在一起,可以写成

public class MyCustomPageModel : PageModel {
    public SomeDTO dto  {get; set;}
}

并进行工作验证!