包装 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;}
}
并进行工作验证!
我使用 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;}
}
并进行工作验证!