ASP.Net C#MVC问题使用AutoMapper将域模型映射到ViewModel

时间:2013-08-14 14:51:34

标签: c# asp.net-mvc asp.net-mvc-3 automapper

我使用AutoMapper将域模型映射到视图模型有点困难。

我的控制器代码是:

    //
    // GET: /Objective/Analyst
    public ActionResult Analyst(int id)
    {
        var ovm = new ObjectiveVM();
        ovm.DatePeriod = new DateTime(2013, 8,1);
        var objectives = db.Objectives.Include(o => o.Analyst).Where(x => x.AnalystId == id).ToList();
        ovm.ObList = Mapper.Map<IList<Objective>, IList<ObjectiveVM>>(objectives);
        return View(ovm);
    }

我在ovm.ObList = Mapper....上收到错误(ObList带有错误的红色下划线):

'ObList': cannot reference a type through an expression; try 'Objectives.ViewModels.ObjectiveVM.ObList' instead

我的目标类是:

   public class Objective
   {
    public int ObjectiveId { get; set; }
    public int AnalystId { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public Analyst Analyst { get; set; }
   }

我的ObjectiveVM(视图模型)是:

   public class ObjectiveVM
   {
    public DateTime DatePeriod { get; set; }
    public class ObList
       {
        public int ObjectiveId { get; set; }
        public int AnalystId { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string AnalystName { get; set; }
        public bool Include { get; set; }
       }
   }

在我的startup / global.asax.cs中,我使用AutoMapper将Objective映射到ObjectiveVM:

   Mapper.CreateMap<Objective, ObjectiveVM.ObList>()
    .ForMember(dest => dest.Include, opt => opt.Ignore())
    .ForMember(dest => dest.AnalystName, opt => opt.MapFrom(y => (y.Analyst.AnalystName)));

非常感谢任何帮助,

标记

2 个答案:

答案 0 :(得分:0)

正如评论者nemesv正确提到的,问题在于

ovm.ObList = Mapper.Map<IList<Objective>, IList<ObjectiveVM>>(objectives);

ObList不是ObjectiveVM的成员,因此,您应该像这样更改ObjectiveVM

public class ObjectiveVM
{
    public DateTime DatePeriod { get; set; }
    public IList<ObList> obList { get; set; }

    public class ObList
    {
        public int ObjectiveId { get; set; }
        public int AnalystId { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string AnalystName { get; set; }
        public bool Include { get; set; }
    }
}

<强>更新

控制器:

public ActionResult Analyst(int id)
{
    var ovm = new ObjectiveVM { DatePeriod = new DateTime(2013, 8, 1) };
    var objectives = db.Objectives.Include(
                 o => o.Analyst).Where(x => x.AnalystId == id).ToList();

    ovm.obList = Mapper.Map<IList<Objective>, 
                 IList<ObjectiveVM.ObList>>(objectives);

    return View(ovm);
}

答案 1 :(得分:0)

好的,感谢所有的建议 - 我最终得到的是:

控制器:

    //
    // GET: /Objective/Analyst

    public ActionResult Analyst(int id)
    {
        var ovm = new ObjectiveVM().obList;
        var objectives = db.Objectives.Include(o => o.Analyst).Where(x => x.AnalystId == id).ToList();
        ovm = Mapper.Map<IList<Objective>, IList<ObjectiveVM.ObList>>(objectives);
        var ovm2 = new ObjectiveVM();
        ovm2.obList = ovm;
        ovm2.DatePeriod = new DateTime(2013, 8,1);
        return View(ovm2);
    }

视图模型:

public class ObjectiveVM
{
    public DateTime DatePeriod { get; set; }
    public IList<ObList> obList { get; set; }
    public class ObList
    {
        public int ObjectiveId { get; set; }
        public int AnalystId { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string AnalystName { get; set; }
        public bool Include { get; set; }
    }
}

CreateMap:

 Mapper.CreateMap<Objective, ObjectiveVM.ObList>()
            .ForMember(dest => dest.Include, opt => opt.Ignore())
            .ForMember(dest => dest.AnalystName, opt => opt.MapFrom(y => (y.Analyst.AnalystName)))
            ;

如果我误解了任何建议,并且您提供了答案,请发布 - 我会将其标记为。

谢谢,

标记