具有 Format 的 DateTime.ToString 在 AutoMapper 中不起作用

问题描述 投票:0回答:1

我的处理程序得到所有

Appointment

public async Task<Result<PagedResult<Responses.AppointmentResponse>>> Handle(Query.GetAppointmentQuery request, CancellationToken cancellationToken)
{
    var EventsQuery = GetAppointmentsQuery(request);

    var Events = await PagedResult<Domain.Entities.Appointment>.CreateAsync(EventsQuery,
            request.PageIndex, request.PageSize);

    var result = mapper.Map<PagedResult<Responses.AppointmentResponse>>(Events);

    return Result.Success(result);
}

这是我的 AutoMapper 个人资料:

CreateMap<Appointment, AppointmentResponse>()
    .ForMember(dest => dest.CreatedDate, opt => opt.MapFrom(src => src.CreatedDate.ToString("dd/MM/yyyy")))
    .ForMember(dest => dest.UpdatedDate, opt => opt.MapFrom(src => src.UpdatedDate.Value.ToString("dd/MM/yyyy")))
    .ReverseMap();

CreateMap<PagedResult<Appointment>, PagedResult<AppointmentResponse>>().ReverseMap();

我在 AutoMapper 中使用的

PagedResult
模式:

public PagedResult(List<T> items, int pageIndex, int pageSize, int totalCount)
{
    this.Items = items;
    this.PageIndex = pageIndex;
    this.PageSize = pageSize;
    this.TotalCount = totalCount;
}

但是我的API输出是:

"createdDate": "11/3/2024 1:25:25 PM",

结果是 MM/dd/yyyy HH:mm:ss PM 就像我电脑中的日期格式

c# automapper
1个回答
0
投票

这里的问题是 AutoMapper 配置中的 .ToString("dd/MM/yyyy") 没有按预期应用。发生这种情况是因为 AutoMapper 不保证 ToString 格式能够直接在这样的映射表达式中工作,因为它处理对象类型和映射的方式。更好的解决方案是创建自定义值解析器或调整 DTO (AppointmentResponse) 本身中的日期时间格式。 1- 首先,创建一个自定义解析器来格式化日期:

    public class DateFormatResolver : IValueResolver<Appointment, AppointmentResponse, string>
{
    public string Resolve(Appointment source, AppointmentResponse destination, string destMember, ResolutionContext context)
    {
        return source.CreatedDate.ToString("dd/MM/yyyy");
    }
}

2- 更新您的 AutoMapper 配置以使用自定义解析器:

CreateMap<Appointment, AppointmentResponse>()
    .ForMember(dest => dest.CreatedDate, opt => opt.MapFrom<DateFormatResolver>())
    .ForMember(dest => dest.UpdatedDate, opt => opt.MapFrom(src => src.UpdatedDate.HasValue 
        ? src.UpdatedDate.Value.ToString("dd/MM/yyyy") : null))
    .ReverseMap();
© www.soinside.com 2019 - 2024. All rights reserved.