如何使用AutoMapper从MVC控制器从域模型映射到视图模型

时间:2013-12-31 15:34:36

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

我试图弄清楚AutoMapper如何在从域模型到具有复杂集合的视图模型创建地图时起作用。 在我的域模型(Search.Domain)中,

我有以下内容:

namespace Search.Domain.Model
{
    public class Result
    {
        public int SearchTime { get; set; }
        public List<ResultDetails> Context { get; set; }
    }

    public class ResultDetails
    {
        public string Entity { get; set; }
        public string Jurisdiction { get; set; }
        public DateTime DateReported { get; set; }
        public string Description { get; set; }
        public DateTime DateEntered { get; set; }
        public string AssociatedLink { get; set; }
        public int Relevance { get; set; }
    }
}

使用MVC项目(Search.WebUI)我有以下内容:

namespace Search.WebUI.Models
{
    public class ResultViewModel
    {
        public int SearchTime { get; set; }
        public List<ResultDetails> Context { get; set; }
    }

    public class ResultDetails
    {
        public string Entity { get; set; }
        public string Jurisdiction { get; set; }
        public DateTime DateReported { get; set; }
        public string Description { get; set; }
        public DateTime DateEntered { get; set; }
        public string AssociatedLink { get; set; }
        public int Relevance { get; set; }
    }
}

在控制器内(HomeController.cs)

namespace Search.WebUI.Controllers
{
    public class HomeController : Controller
    {
        private ISearchResultManager sr = new ResultManager();  

        public ActionResult Index()
        {
            ResultViewModel searchresults;

            var results = sr.GetSearchResults(5);
            Mapper.CreateMap<Search.Domain.Model.Result, ResultViewModel>();

            searchresults = Mapper.Map<Search.Domain.Model.Result, ResultViewModel>(results);

            return View("Home", searchresults);
        }
    }
}

运行时生成的错误消息是:

Missing type map configuration or unsupported mapping.

Mapping types:
ResultDetails -> ResultDetails
Search.Domain.Model.ResultDetails -> Search.WebUI.Models.ResultDetails

Destination path:
ResultViewModel.Context.Context.Context0[0]

Source value:
Search.Domain.Model.ResultDetails

在看这个时,似乎嵌套的List<ResultDetails>导致了一个问题,但我不知道我应该做些什么来处理这种类型的映射。

一直回到域中以引用该类型是否正确?这似乎是我将域名拉入UI,我不想这样做?

是否有另一种选择来映射域模型以在UI中查看模型?基本上我希望在UI中有一个视图模型,我可以扩展到域模型之外用于UI目的,而不是引用域模型。

我是autoMapper的新手,所以这整件事可能都错了?我将不胜感激任何建议或指导。

1 个答案:

答案 0 :(得分:0)

在映射包含类时,AutoMapper不会查看所有可能的子映射。您还需要显式添加ResultDetails的映射:

        Mapper.CreateMap<Search.Domain.Model.Result.ResultDetails,
                         Search.WebUI.Models.ResultDetails>();