我使用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));
}
}
}
谢谢!
答案 0 :(得分:0)
假设您有一个自定义页面模型,将其设为MyCustomPageModel
,它继承了PageModel
,并且其中包含某种DTO。此DTO包含一些具有属性验证或其他形式的验证的属性。当用作页面模型时,尽管它不会自己继承PageModel
,但验证仍适用于DTO中的字段。综上所述,可以写作
public class MyCustomPageModel : PageModel {
public SomeDTO dto {get; set;}
}
并具有有效的验证!