2012-04-20 21 views
7

Attualmente sto usando ViewModels per separare le mie viste dall'attuale struttura del modello."Unisci" modello e ViewModel con o senza AutoMapper?

Ad esempio, ho un'entità di persistenza utente e un MyProfile ViewModel contenente tutte le informazioni che un utente può modificare autonomamente. Per la conversione da Utente a MioProfilo sto usando Automapper.

Ora, dopo che un utente ha rinviato le sue informazioni (modificate), ho bisogno di salvarle. Ma le informazioni nel ViewModel non sono complete e quando AutoMapper crea un'entità di persistenza utente dal ViewModel, le informazioni importanti vengono perse.

Non voglio esporre questa informazione al livello di vista, specialmente non con elementi di forma nascosti.

Quindi ho bisogno di un modo per unire un ViewModel in un'entità di persistenza. Posso farlo con AutoMapper, o devo farlo manualmente?

Esempio:

La mia classe utente contiene ID, Nome, Cognome, Nome utente e Password. L'utente deve modificare solo il suo nome e cognome nel suo profilo. Pertanto il mio ProfileViewModel contiene ID, Firstname e Lastname. Dopo aver postato le informazioni dal modulo, Automapper crea un oggetto Utente dal ProfileViewModel trasferito e in questo oggetto sono impostati solo ID, Nome e Cognome. Durante l'alimentazione di questa entità nel mio repository, ho perso le informazioni su nome utente e password.

+0

Perché l'informazione non è completa? Potresti pubblicare un pezzo di codice? –

+0

Stavo usando Mapper.Map (modello) invece di cercare prima l'Entità utente e quindi utilizzare Mapper.Map (utente, modello) – ckonig

risposta

12

Quindi ho bisogno di un modo per unire un ViewModel in un'entità di persistenza. Posso fare con AutoMapper o devo farlo manualmente?

Sì, lo si può fare con AutoMapper. Per esempio:

public class Model 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class ViewModel 
{ 
    public string Name { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     // define a map (ideally once per appdomain => usually goes in Application_Start) 
     Mapper.CreateMap<ViewModel, Model>(); 

     // fetch an entity from a db or something 
     var model = new Model 
     { 
      Id = 5, 
      Name = "foo" 
     }; 

     // we get that from the view. It contains only a subset of the 
     // entity properties 
     var viewModel = new ViewModel 
     { 
      Name = "bar" 
     }; 

     // Now we merge the view model properties into the model 
     Mapper.Map(viewModel, model); 

     // at this stage the model.Id stays unchanged because 
     // there's no Id property in the view model 
     Console.WriteLine(model.Id); 

     // and the name has been overwritten 
     Console.WriteLine(model.Name); 
    } 
} 

stampe:

5 
bar 

e tradurre questo in un modello tipico ASP.NET MVC:

[HttpPost] 
public ActionResult Update(MyViewModel viewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     // validation failed => redisplay view 
     return View(viewModel); 
    } 

    // fetch the domain entity that we want to udpate 
    DomainModel model = _repository.Get(viewModel.Id); 

    // now merge the properties 
    Mapper.Map(viewModel, model); 

    // update the domain model 
    _repository.Update(mdoel); 

    return RedirectToAction("Success"); 
} 
+0

Va bene, adesso è logico! E sembra molto meglio dell'utilizzo di un metodo UpdateModel() in blackbox. – ckonig