Проверка модели на модели страницы, заключающей DTO - PullRequest
0 голосов
/ 09 мая 2019

Я довольно долго играл с ASP.NET Core MVC, и теперь я сталкиваюсь с неудачей. Я реализовал свой проект, используя CQRS, используя mediatR и automapper, но, похоже, не могу найти правильный способ проверки моделей страниц.

Мой дизайн основан на отделении сущностей от страниц. Команды / запросы возвращают модель страницы, которая обычно включает в себя 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 голосов
/ 26 мая 2019

Предположим, у вас есть пользовательская модель страницы, пусть она будет MyCustomPageModel, которая наследует PageModel, и она содержит DTO некоторого вида. Этот DTO содержит некоторые свойства, которые имеют проверку атрибутов или другую форму проверки. При использовании в качестве модели страницы проверка по-прежнему будет работать для полей внутри DTO, хотя она не наследует себя PageModel. Чтобы собрать это вместе, можно написать

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

и рабочая проверка!

...