c# - 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 -> List
1 System.Collections.Generic.IEnumerable1[[PowerITCRM.Features.Lead.LeadMetaDto, PowerITCRM.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List
1[[PowerITCRM.Web.Models.Lead.DashboardEnquiryMetaViewModel, PowerITCRM.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] AutoMapper.AutoMapperMappingException:错误映射类型。映射类型: IEnumerable
1 -> List
1 System.Collections.Generic.IEnumerable1[[PowerITCRM.Features.Lead.LeadMetaDto, PowerITCRM.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List
1[[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 , IEnumerable1 , List
1 , ResolutionContext ) --- 内部异常堆栈跟踪结束 --- at lambda_method(Closure , IEnumerable1 , List
1 , 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 -> List
1 System.Collections.Generic.IEnumerable1[[PowerITCRM.Features.Lead.LeadMetaDto, PowerITCRM.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List
1[[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 , IEnumerable1 , List
1 , ResolutionContext ) --- 内部异常堆栈跟踪结束 --- at lambda_method(Closure , IEnumerable1 , List
1 , 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
解决方案
您的代码应如下所示:
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!
推荐阅读
- .net-core - HttpGet 与三个关系表与 dot net core web api
- cypress - 如何使用 cy.readfile() 从 Cypress 中的 JSON 文件中读取测试数据并使其在测试中可用
- flutter - 在下拉菜单颤动中显示来自 API 的数据的问题
- c# - FireBaseAdmin 与 Asp.net Core 发送图像通知
- ffmpeg - Netflix / vmaf 结果代表什么?
- python - Django:为相关模型的字段提供计数
- bootstrap-4 - 如何在引导程序中彼此相邻显示汉堡菜单项?
- c# - 如何为鼠标悬停状态下的 CheckBox 的背景颜色设置条件?
- chart.js - 完全删除 0 值的条形图
- c# - 如何从方法中抛出异常并防止多线程