Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用参数AutoMapper映射viewmodel子对象_C#_Asp.net Mvc_Asp.net Core_Automapper_Viewmodel - Fatal编程技术网

C# 使用参数AutoMapper映射viewmodel子对象

C# 使用参数AutoMapper映射viewmodel子对象,c#,asp.net-mvc,asp.net-core,automapper,viewmodel,C#,Asp.net Mvc,Asp.net Core,Automapper,Viewmodel,我刚刚使用AutoMapper,遇到了一个问题 我有一个这样的模型 public class StepUp { public string Example {get;set;} public string Example2 {get;set;} public decimal? auxValue { get;set; } } 但我有两个ViewModels作为目标 public class NuevoStepUpViewModel() { public bool

我刚刚使用AutoMapper,遇到了一个问题

我有一个这样的模型

public class StepUp {
    public string Example {get;set;}
    public string Example2 {get;set;}
    public decimal? auxValue { get;set; }
}
但我有两个ViewModels作为目标

public class NuevoStepUpViewModel()
{
    public bool TieneAuxiliar { get; set; }
    public string Example { get;set; }
    public CargaDatosElectricos CargaDatosElectricos { get; set; }
}

public class CargaDatosElectricos {
    public CargaDatosElectricos(bool tieneAuxiliar)
    {
        TieneAuxiliar = tieneAuxiliar;
    }
    public readonly bool TieneAuxiliar;
    public string Example2 { get; set; }
}
我认为有些人是这样的:

CreateMap<StepUp,NuevoStepUpViewModel()
    .ForMember(x => x.TieneAuxiliar, x => x.MapFrom(c => c.auxValue.HasValue))
    .ForMember(x => x.Example, x => x.MapFrom(c => c.Example))
    .ForMember(x => x.CargaDatosElectricos.Example2, x => x.MapFrom(c => c.Example2))
    .BeforeMap((x,y) => {
        x.CargaDatosElectricos = new CargaDatosElectricos(c.auxValue.HasValue);
    });
CreateMap x.TieneAuxiliar,x=>x.MapFrom(c=>c.auxValue.HasValue))
.ForMember(x=>x.Example,x=>x.MapFrom(c=>c.Example))
.ForMember(x=>x.CargaDatosElectricos.Example2,x=>x.MapFrom(c=>c.Example2))
.BeforeMap((x,y)=>{
x、 CargaDatosElectricos=新的CargaDatosElectricos(c.auxValue.HasValue);
});
但是我越来越

表达式“x=>x.CargaDatosElectricos.Example2”必须解析为 顶级成员,而不是任何子对象的属性


我应该如何创建映射器配置来执行这种类型的映射?

您的代码中有一些错误。您可以使用
AfterMap
范围而不是
BeforeMap
来更好地配置映射,以提供复杂的配置。(我不确定,但我认为)
AutoMapper
不会引用类型为类的属性。因此,您必须在目标类(VIewModel)的构造函数上执行此操作,或者在
AfterMap
上执行此操作

TieneAuxiliar
属性将不允许您在其为
readonly
时设置值,因此,您将无法配置此属性的映射。我把它改成一个公共的经典财产

请参见此处的工作示例:

使用系统;
使用自动制版机;
公共课程
{
公共静态void Main()
{
var config=new-MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ForMember(vm=>vm.TieneAuxiliar,opt=>opt.MapFrom(e=>e.auxValue.HasValue))
.ForMember(vm=>vm.Example,opt=>opt.MapFrom(e=>e.Example))
.AfterMap((e,vm)=>
{
vm.CargaDatosElectricos.Example2=e.Example2;
});
});
var mapper=config.CreateMapper();
var steppup=新的steppup()
{
Example=“Example 1”,
Example2=“Example2”,
auxValue=10m
};
var viewModel=mapper.Map(逐步升级);
Console.WriteLine(“SteUp已转换为ViewModel”);
WriteLine(“TieneAuxiliar:{0}”,viewModel.TieneAuxiliar);
WriteLine(“示例:{0}”,viewModel.Example);
WriteLine(“CargaDatosElectricos.TieneAuxiliar:{0}”,viewModel.CargaDatosElectricos.TieneAuxiliar);
WriteLine(“CargaDatosElectricos.Example2:{0}”,viewModel.CargaDatosElectricos.Example2);
}
公共课加强
{
公共字符串示例{get;set;}
公共字符串示例2{get;set;}
公共十进制?auxValue{get;set;}
}
公共类NuevoStepUpViewModel
{
公共bool TieneAuxiliar{get;set;}
公共字符串示例{get;set;}
公共CARGADOTOSELECTRICOS CARGADOTOSELECTRICOS{get;set;}
public NuevoStepUpViewModel()
{
this.CargaDatosElectricos=新的CargaDatosElectricos();
}
}
公共类CargaDatosElectricos
{
公共CargaDatosElectricos()
{
}
公共bool TieneAuxiliar{get;set;}
公共字符串示例2{get;set;}
}
}

您以前试过使用automapper吗?我的意思是,在你的createMap之前,再做一个createMap。例如,2它可能已经解决了,看看这是否回答了你的问题?
using System;
using AutoMapper;

public class Program
{
    public static void Main()
    {
        var config = new MapperConfiguration(cfg => 
        {
            cfg.CreateMap<StepUp, NuevoStepUpViewModel>()
                .ForMember(vm => vm.TieneAuxiliar, opt => opt.MapFrom(e => e.auxValue.HasValue))
                .ForMember(vm => vm.Example, opt => opt.MapFrom(e => e.Example))
                .AfterMap((e, vm) => 
                          {
                              vm.CargaDatosElectricos.Example2 = e.Example2;
                          });
        });

        var mapper = config.CreateMapper();

        var stepUp = new StepUp()
        {
            Example = "Example 1",
            Example2 = "Example 2",
            auxValue = 10m
        };

        var viewModel = mapper.Map<StepUp, NuevoStepUpViewModel>(stepUp);

        Console.WriteLine("SteUp was converted to ViewModel");
        Console.WriteLine("TieneAuxiliar: {0}", viewModel.TieneAuxiliar);
        Console.WriteLine("Example: {0}", viewModel.Example);
        Console.WriteLine("CargaDatosElectricos.TieneAuxiliar: {0}", viewModel.CargaDatosElectricos.TieneAuxiliar);
        Console.WriteLine("CargaDatosElectricos.Exemple2: {0}", viewModel.CargaDatosElectricos.Example2);

    }

    public class StepUp 
    {
        public string Example { get; set; }
        public string Example2 { get; set; }
        public decimal? auxValue { get; set; }
    }

    public class NuevoStepUpViewModel
    {
        public bool TieneAuxiliar { get; set; }
        public string Example { get;set; }
        public CargaDatosElectricos CargaDatosElectricos { get; set; }

        public NuevoStepUpViewModel() 
        {
            this.CargaDatosElectricos = new CargaDatosElectricos();
        }
    }

    public class CargaDatosElectricos 
    {
        public CargaDatosElectricos()
        {
        }
        public bool TieneAuxiliar { get; set; }
        public string Example2 { get; set; }
    }
}