【问题标题】:Convert Model into a ViewModel [duplicate]将模型转换为 ViewModel [重复]
【发布时间】:2014-01-09 16:48:40
【问题描述】:

我的表 OWNER 有一个模型

namespace MyApp.Models
{
    public partial class Owner
    {
        public int owner_id { get; set; }
        public string firstname { get; set; }
        public string lastname { get; set; }
        public string address { get; set; }
        public string city { get; set; }

        public virtual User User { get; set; }
    }
}

然后我有我的 ViewModel

public partial class OwnerData
{
    public string firstname { get; set; }
    public string lastname { get; set; }
    public string address { get; set; }
}

我的控制器

    public ActionResult Index()
    {
        //Create the object Owner based on the User Identity
        Owner owner = CustomDbFunctions.GetUserEntity(User, db).Owner;

//New instance of the ViewModel
        OwnerData ownerData = new OwnerData();

        ownerData.lastname = owner.lastname;
        ownerData.firstname = owner.firstname;
        ownerData.address = owner.address;

            return View(ownerData);

    }

有一种更简单的方法可以将我的 owner 转换为 ownerData 而不重写我的对象的每个属性?

【问题讨论】:

  • 有办法,但肯定不简单。保持这种方式
  • 有些工具使用“反射”并通过匹配属性名称为您执行此操作。我现在会保持这种方式,但会在 OwnerData 中添加一个接受 Owner 对象并执行此操作的构造函数。
  • @A Khudairy 我想我通过 Mapper.CreateMap(); 然后 Automapper 找到了一个很好的解决方案b>OwnerData ownerData = Mapper.Map(CustomDbFunctions.GetUserEntity(User, db).Owner);

标签: asp.net-mvc-4 entity-framework-4 viewmodel


【解决方案1】:

我想我用Automapper解决了这个问题

public ActionResult Index()
{
    //Create the object Owner based on the User Identity
    Owner owner = CustomDbFunctions.GetUserEntity(User, db).Owner;

    Mapper.CreateMap<Owner, OwnerData>();
    OwnerData ownerData = Mapper.Map<Owner, OwnerData>(owner);

  return View(ownerData);
}

或者如果您更喜欢动态函数

    static TDestination GenerateMappingTable<TSource, TDestination>(TSource inputModel)
    {
        Mapper.CreateMap<TSource, TDestination>();
        return Mapper.Map<TSource, TDestination>(inputModel);
    }

要安装 Automapper,只需执行

PM> Install-Package AutoMapper

来自包管理器控制台。

【讨论】:

  • Mapper.CreateMap 调用应该在每个应用程序域中调用一次。我们应该在 Application_Start() 方法中调用它。否则,每当调用 Index() 时都会调用它
【解决方案2】:

你可以使用object initizalizers。这样会更简单,但我不确定这是不是你想要的

OwnerData ownerData = new OwnerData  { 
                          lastname = owner.lastname;
                          firstname = owner.firstname;
                          address = owner.address;
                          };

【讨论】:

  • 最好编辑构造函数,而不是每次需要时都这样做。
猜你喜欢
  • 2012-06-21
  • 2015-03-29
  • 1970-01-01
  • 2020-11-25
  • 2017-02-14
  • 1970-01-01
  • 2021-10-24
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多