0

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)));

どんな助けでも大歓迎です、

マーク

4

2 に答える 2

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);
}
于 2013-08-14T15:18:31.007 に答える
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; }
    }
}

マップの作成:

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

私がアドバイスを誤解していて、あなたが答えを提供してくれた場合は、投稿してください。そのようにマークします。

ありがとうございました、

マーク

于 2013-08-15T07:41:45.950 に答える