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

时间:2019-05-09 17:45:44

标签: asp.net-mvc validation .net-core cqrs

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

我的设计基于将实体与页面分开的情况。命令/查询返回页面模型,该页面模型通常包装DTO,该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));
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

假设您有一个自定义页面模型,将其设为MyCustomPageModel,它继承了PageModel,并且其中包含某种DTO。此DTO包含一些具有属性验证或其他形式的验证的属性。当用作页面模型时,尽管它不会自己继承PageModel,但验证仍适用于DTO中的字段。综上所述,可以写作

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

并具有有效的验证!