使用 Automapper 映射 EditModel
Map EditModel using Automapper
我一直在尝试使用 Automapper 映射 ViewModel class,其中 class 如下所列:
public class Product
{
[Key]
public int ProductId { get; set; }
public string Name { get; set; }
public ICollection<Color> Color { get; set; }
}
public class Color
{
[Key]
public int id { get; set; }
public string value { get; set; }
public virtual ICollection<Product> products { get; set; }
}
public class ProductVM
{
[Key]
public int ProductId { get; set; }
public string Name { get; set; }
public List<int> Color { get; set; }
public IEnumerable<Color> Colors { get; set; }
}
使用颜色,我将所有可用颜色传递给视图供用户选择,使用颜色 属性 获取值,将类似这样的内容放入视图中:
@Html.ListBoxFor(model => Model.Color, new MultiSelectList(Model.Colors, "id", "value"));
然后在一个控制器中,我有一个 Post 方法来保存它。我尝试使用 Automapper 来转换 classes 但它无法映射 Color 属性 因为它应该通过可用的 id 获取 Color 对象。
Mapper.CreateMap<ProductVM, Product>();
Product product = AutoMapper.Mapper.Map<ProductVM, Product>(productVM);
db.Products.Add(product);
db.SaveChanges();
我是不是遗漏了什么?
发生这种情况是因为 Automapper 不知道如何将 List Color 映射到 ICollection Colors。也尝试为此创建一个地图。
Mapper.CreateMap<SourceObject, TargetObject>();
Mapper.CreateMap<SourceOuterObject, TargetOuterObject>()
.ForMember(dest => dest.TargetList, opt => opt.MapFrom(src => src.SourceSet.SourceList);
我在我的解决方案中尝试了一些方法,颜色将为空,因为选择列表未从视图中返回。您的 int (color) 列表不会为空,您可以将其映射到颜色对象。
var productVM = new ProductVM
{
Name = "Test",
ProductId = 5,
Colors = null,
Color = new List<int> {1, 5, 8}
};
Mapper.CreateMap<int, Color>()
.ForMember(dest => dest.id, opt => opt.MapFrom(src => src));
Mapper.CreateMap<ProductVM, Product>()
.ForMember(dest => dest.Color, opt => opt.MapFrom(src => src.Color));
Product product = AutoMapper.Mapper.Map<ProductVM, Product>(productVM);
db.Products.Add(product);
db.SaveChanges();
我一直在尝试使用 Automapper 映射 ViewModel class,其中 class 如下所列:
public class Product
{
[Key]
public int ProductId { get; set; }
public string Name { get; set; }
public ICollection<Color> Color { get; set; }
}
public class Color
{
[Key]
public int id { get; set; }
public string value { get; set; }
public virtual ICollection<Product> products { get; set; }
}
public class ProductVM
{
[Key]
public int ProductId { get; set; }
public string Name { get; set; }
public List<int> Color { get; set; }
public IEnumerable<Color> Colors { get; set; }
}
使用颜色,我将所有可用颜色传递给视图供用户选择,使用颜色 属性 获取值,将类似这样的内容放入视图中:
@Html.ListBoxFor(model => Model.Color, new MultiSelectList(Model.Colors, "id", "value"));
然后在一个控制器中,我有一个 Post 方法来保存它。我尝试使用 Automapper 来转换 classes 但它无法映射 Color 属性 因为它应该通过可用的 id 获取 Color 对象。
Mapper.CreateMap<ProductVM, Product>();
Product product = AutoMapper.Mapper.Map<ProductVM, Product>(productVM);
db.Products.Add(product);
db.SaveChanges();
我是不是遗漏了什么?
发生这种情况是因为 Automapper 不知道如何将 List
Mapper.CreateMap<SourceObject, TargetObject>();
Mapper.CreateMap<SourceOuterObject, TargetOuterObject>()
.ForMember(dest => dest.TargetList, opt => opt.MapFrom(src => src.SourceSet.SourceList);
我在我的解决方案中尝试了一些方法,颜色将为空,因为选择列表未从视图中返回。您的 int (color) 列表不会为空,您可以将其映射到颜色对象。
var productVM = new ProductVM
{
Name = "Test",
ProductId = 5,
Colors = null,
Color = new List<int> {1, 5, 8}
};
Mapper.CreateMap<int, Color>()
.ForMember(dest => dest.id, opt => opt.MapFrom(src => src));
Mapper.CreateMap<ProductVM, Product>()
.ForMember(dest => dest.Color, opt => opt.MapFrom(src => src.Color));
Product product = AutoMapper.Mapper.Map<ProductVM, Product>(productVM);
db.Products.Add(product);
db.SaveChanges();