首页 > 解决方案 > AspNetBoilerPlate AutoMapper 映射列表时出现异常

问题描述

我正在使用 AspNetBoilerPlate Core,并且在将项目列表映射到视图模型时遇到问题

我在应用层有这个 DTO

[AutoMapFrom(typeof(LeadMeta.LeadMeta))]
public class LeadMetaDto : EntityDto
{
    public int LeadId { get; set; }
    public int? TenantId { get; set; }

    public string Key { get; set; }
    public string Value { get; set; }
    public string FriendlyKey { get; set; }
}

我想将它映射到 mvc 层中的相同视图模型,所以我从我的控制器执行以下操作

var lead = await _leadAppService.Get(Id);
enquiry.LeadMeta = new List<DashboardEnquiryMetaViewModel>(lead.LeadMeta);

这是 DashboardEnquiryMetaViewModel

[AutoMapFrom(typeof(LeadMetaDto))]
public class DashboardEnquiryMetaViewModel: LeadMetaDto
{
    public DashboardEnquiryMetaViewModel(LeadMetaDto output)
    {
        output.MapTo(this);
    }
}

但是我的尝试产生了以下错误:

INFO 2019-09-05 19:16:47,551 [9] ore.Mvc.Internal.ControllerActionInvoker - 使用参数 (13005) 执行操作方法 PowerITCRM.Web.Controllers.LeadController.Dashboard (PowerITCRM.Web.Mvc) - 验证状态:有效错误 2019-09-05 19:16:48,427 [6] Mvc.ExceptionHandling.AbpExceptionFilter - 错误映射类型。

映射类型:IEnumerable 1 -> List1 System.Collections.Generic.IEnumerable 1[[PowerITCRM.Features.Lead.LeadMetaDto, PowerITCRM.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List1[[PowerITCRM.Web.Models.Lead.DashboardEnquiryMetaViewModel, PowerITCRM.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] AutoMapper.AutoMapperMappingException:错误映射类型。

映射类型: IEnumerable 1 -> List1 System.Collections.Generic.IEnumerable 1[[PowerITCRM.Features.Lead.LeadMetaDto, PowerITCRM.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List1[[PowerITCRM.Web.Models.Lead.DashboardEnquiryMetaViewModel, PowerITCRM.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] ---> System.ArgumentException:PowerITCRM.Web.Models.Lead.DashboardEnquiryMetaViewModel 需要有一个带有 0 个参数或只有可选参数的构造函数。参数名称:type at lambda_method(Closure , IEnumerable 1 , List1 , ResolutionContext ) --- 内部异常堆栈跟踪结束 --- at lambda_method(Closure , IEnumerable 1 , List1 , ResolutionContext )
在 AutoMapper.Mapper.AutoMapper.IMapper.Map[TSource,TDestination](TSource 源,TDestination 目的地) 在 C:\projects\automapper\src\AutoMapper\Mapper.cs:PowerITCRM.Web.Controllers.LeadController.Dashboard 的第 271 行(Int32 Id)在 C:\Users\User\Documents\Visual Studio 2017\Projects\PowerITCRM\src\PowerITCRM.Web.Mvc\Controllers\LeadController.cs:line 126 at lambda_method(Closure, Object) 在 Microsoft.AspNetCore。 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync 的 Mvc.Internal.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper 映射器,ObjectMethodExecutor 执行器,对象控制器,Object[] 参数) () 在 Microsoft.AspNetCore.Mvc.Internal。ControllerActionInvoker.Rethrow(ActionExecutedContext context) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore .Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync() 信息 2019-09-05 19:16:48,434 [6] ore.Mvc.Internal.ControllerActionInvoker - 执行操作 PowerITCRM.Web.Controllers.LeadController.Dashboard (PowerITCRM.Web.Mvc)在 898.9158ms 错误 2019-09-05 19:16:48,618 [6AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync() 信息 2019-09-05 19:16:48,434 [6] ore.Mvc.Internal.ControllerActionInvoker - 执行操作 PowerITCRM .Web.Controllers.LeadController.Dashboard (PowerITCRM.Web.Mvc) 在 898.9158ms 错误 2019-09-05 19:16:48,618 [6AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync() 信息 2019-09-05 19:16:48,434 [6] ore.Mvc.Internal.ControllerActionInvoker - 执行操作 PowerITCRM .Web.Controllers.LeadController.Dashboard (PowerITCRM.Web.Mvc) 在 898.9158ms 错误 2019-09-05 19:16:48,618 [6
] nostics.DeveloperExceptionPageMiddleware - 执行请求时发生未处理的异常。AutoMapper.AutoMapperMappingException:错误映射类型。

映射类型: IEnumerable 1 -> List1 System.Collections.Generic.IEnumerable 1[[PowerITCRM.Features.Lead.LeadMetaDto, PowerITCRM.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List1[[PowerITCRM.Web.Models.Lead.DashboardEnquiryMetaViewModel, PowerITCRM.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] ---> System.ArgumentException:PowerITCRM.Web.Models.Lead.DashboardEnquiryMetaViewModel 需要有一个带有 0 个参数或只有可选参数的构造函数。参数名称:type at lambda_method(Closure , IEnumerable 1 , List1 , ResolutionContext ) --- 内部异常堆栈跟踪结束 --- at lambda_method(Closure , IEnumerable 1 , List1 , ResolutionContext )
在 AutoMapper.Mapper.AutoMapper.IMapper.Map[TSource,TDestination](TSource 源,TDestination 目的地) 在 C:\projects\automapper\src\AutoMapper\Mapper.cs:PowerITCRM.Web.Controllers.LeadController.Dashboard 的第 271 行(Int32 Id)在 C:\Users\User\Documents\Visual Studio 2017\Projects\PowerITCRM\src\PowerITCRM.Web.Mvc\Controllers\LeadController.cs:line 126 at lambda_method(Closure, Object) 在 Microsoft.AspNetCore。 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync 的 Mvc.Internal.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper 映射器,ObjectMethodExecutor 执行器,对象控制器,Object[] 参数) () 在 Microsoft.AspNetCore.Mvc.Internal。ControllerActionInvoker.Rethrow(ActionExecutedContext context) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore .Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ExceptionContext context) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted ) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) 在 Microsoft.AspNetCore.Mvc 的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()。Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() 上 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() 的 Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
AspNetCore.SignalR.Hubs.AbpCommonHub - 客户端断开连接:fpR1HzE9UYrEMvP_yNR28w INFO 2019-09-05 19:16:48,758 [13] soft.AspNetCore.Hosting.Internal.WebHost - 请求在 4111.2398ms 101 INFO 2019-09-05 完成19:16:48,854 [6] soft.AspNetCore.Hosting.Internal.WebHost - 请求在 1333.083ms 500 text/html 内完成;字符集=utf-8

标签: c#asp.net-coreautomapperaspnetboilerplate

解决方案


您的代码应如下所示:

var lead = await _leadAppService.Get(Id);
enquiry.LeadMeta = new List<DashboardEnquiryMetaViewModel>
{
    new DashboardEnquiryMetaViewModel(lead.LeadMeta)
    //or lead.LeadMeta.MapTo<DashboardEnquiryMetaViewModel>();
};

这部分代码会导致异常:

enquiry.LeadMeta = new List<DashboardEnquiryMetaViewModel>(lead.LeadMeta);

您将对象传递给列表的构造函数,而不是 ViewModel!


推荐阅读