Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
Asp.net mvc 使用ValueInjector在具有不同属性名称的对象之间映射_Asp.net Mvc_Asp.net Mvc 3_Asp.net Mvc 2_Mapping_Valueinjecter - Fatal编程技术网

Asp.net mvc 使用ValueInjector在具有不同属性名称的对象之间映射

Asp.net mvc 使用ValueInjector在具有不同属性名称的对象之间映射,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-2,mapping,valueinjecter,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 2,Mapping,Valueinjecter,如何将属性从一个对象映射到另一个具有不同属性名称的对象 我有一个产品类,看起来像这样: public class Product : IEntity { public int Id { get; set; } public string Name { get; set; } } 视图模型如下所示: public class ProductSpecificationAddViewModel { public int ProductId { get; set; }

如何将属性从一个对象映射到另一个具有不同属性名称的对象

我有一个
产品
类,看起来像这样:

public class Product : IEntity
{
     public int Id { get; set; }
     public string Name { get; set; }
}
视图模型如下所示:

public class ProductSpecificationAddViewModel
{
     public int ProductId { get; set; }
     public string ProductName { get; set; }
}
我需要进行以下映射:

Product.Id => ProductSpecificationAddViewModel.ProductId
Product.Name =>ProductSpecificationAddViewModel.ProductName
以下是我的行动方法:

public ActionResult Add(int id)
{
     Product product = productService.GetById(id);

     // Mapping
     //ProductSpecificationAddViewModel viewModel = new ProductSpecificationAddViewModel();
     //viewModel.InjectFrom(product);

     return View(viewModel);
}

我该怎么做?

您可以使用AutoMapper轻松完成这项工作。默认情况下是使用约定(即Id映射到Id和名称映射到名称),但您也可以定义自定义映射

Mapper.CreateMap<Product, ProductSpecificationAddViewModel>()
    .ForMember(destination => destination.ProductName,
               options => options.MapFrom(
                    source => source.Name));

如果您使用的是ValueInjector,那么您将编写一个ConventionInjection。参见第二个示例

此注入将从TSource.*的所有属性执行到TTarget.TSource+*,因此您可以:

vm.InjectFrom<PropToTypeProp>(product);
vm.InjectFrom(产品);

我知道使用AutoMapper很容易,但由于信任级别的原因,我无法在web主机服务器上使用它,因此我需要满足于ValueInjector。只是好奇而已。服务器上的Automapper需要什么信任级别。两者都是DLL,对吗?中等信任托管服务与automapper存在问题,因为反射.Emit在中等信任环境下不工作ConventionInjection现在世界上任何地方都找不到。
    public class PropToTypeProp : ConventionInjection
    {
        protected override bool Match(ConventionInfo c)
        {
            return c.TargetProp.Name == c.Source.Type.Name + c.TargetProp.Name;
        }
    }
vm.InjectFrom<PropToTypeProp>(product);