2014-01-09 3 views
1

У меня есть модель для моего стола ВЛАДЕЛЬЦАПреобразовать модель в ViewModel

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 без переписать evry одно свойство моего объекта?

+0

есть способ, но это не просто для уверенности. Keep this way –

+0

Есть инструменты, которые используют «Отражение» и делают это для вас, сопоставляя имена свойств. Я бы сохранил этот путь до сих пор, но добавил бы конструктор в OwnerData, который принимает объект Owner и делает это. –

+1

@A Khudairy Я думаю, что нашел хорошее решение, используя ** Automapper **, сделав ** Mapper.CreateMap (); ** и затем ** OwnerData ownerData = Mapper.Map (CustomDbFunctions.GetUserEntity (User, db) .Owner); ** – Sefira

ответ

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 

с консоли диспетчера пакетов.

+0

Вызов Mapper.CreateMap должен выполняться один раз для домена приложения. Мы должны назвать это методом Application_Start(). В противном случае он будет вызываться всякий раз, когда вызывается Index() –

1

Вы можете использовать object initizalizers .Это делает его более простым, но я не уверен, что это то, что вы хотите

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

Лучше отредактировать конструктор Вместо того, чтобы делать это каждый раз, когда вам это нужно. –

Смежные вопросы