2013-04-30 11 views
7

Sono nuovo di ASP.net MVC e sto usando un viewmodel piuttosto che i viewbags per popolare i miei elenchi a discesa poiché ho visto la maggior parte delle persone consigliare contro di loro. Ho un'interfaccia utente scorrevole che fa dropdown a cascata e autocompletes (non mostrato qui), ma non riesco a recuperare i miei dati nel database.Salvataggio dei dati Viewmodel nel database in ASP.NET MVC

Modelli:

public partial class Car 
    { 
     public int CarID { get; set; } 
     public string CarName { get; set; } 
     public int ModelID { get; set; } 
     public int ManufacturerID { get; set; } 
     public int CarColorID { get; set; } 
     public Nullable<decimal> Price { get; set; } 
     public string Description { get; set; } 

     public virtual CarColor CarColor { get; set; } 
     public virtual Manufacturer Manufacturer { get; set; } 
     public virtual CarModel CarModel { get; set; } 
    } 
    public partial class CarColor 
    { 
     public CarColor() 
     { 
      this.Cars = new HashSet<Car>(); 
     } 

     public int ColorID { get; set; } 
     public string ColorName { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
    } 
    public partial class CarModel 
    { 
     public CarModel() 
     { 
      this.Cars = new HashSet<Car>(); 
     } 

     public int CarModelID { get; set; } 
     public int ManufacturerID { get; set; } 
     public string CarModelName { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
     public virtual Manufacturer Manufacturer { get; set; } 
    } 
    public partial class Manufacturer 
    { 
     public Manufacturer() 
     { 
      this.Cars = new HashSet<Car>(); 
      this.Manufacturer1 = new HashSet<Manufacturer>(); 
      this.CarModels = new HashSet<CarModel>(); 
     } 

     public int ManufacturerID { get; set; } 
     public string ManufacturerName { get; set; } 
     public Nullable<int> ParentID { get; set; } 

     public virtual ICollection<Car> Cars { get; set; } 
     public virtual ICollection<Manufacturer> Manufacturer1 { get; set; } 
     public virtual Manufacturer Manufacturer2 { get; set; } 
     public virtual ICollection<CarModel> CarModels { get; set; } 
    } 

ViewModel:

Controller:

public ActionResult Create() 
     { 
      var model = new AnotherTestViewModel(); 
      using (new CarTestEntities()) 
      { 
       model.CarModels = db.CarModels.ToList().Select(x => new SelectListItem 
       { 
        Value = x.CarModelID.ToString(), 
        Text = x.CarModelName 
       }); 
       model.Manufacturers = db.Manufacturers.ToList().Select(x => new SelectListItem 
       { 
        Value = x.ManufacturerID.ToString(), 
        Text = x.ManufacturerName 
       }); 
       model.CarColors = db.CarColors.ToList().Select(x => new SelectListItem 
       { 
        Value = x.ColorID.ToString(), 
        Text = x.ColorName 
       }); 
      } 
      return View(model); 
     } 

     // 
     // POST: /AnotherTest/Create 

     [HttpPost] 
     public ActionResult Create(AnotherTestViewModel model) 
     { 
       if (ModelState.IsValid) 
       { 
        db.Entry(model).State = EntityState.Modified; 
        db.SaveChanges(); 
        return RedirectToAction("Details", "AnotherTestViewModel", new { id = model.car.CarID }); 
       } 
       return View(); 
     } 

ho visto alcune raccomandazioni per usare Automapper perché EntityState.Modified non funziona, ma io non sono sicuro di come configurarlo perché l'utilizzo del codice riportato di seguito non ha funzionato.

Mapper.CreateMap<AnotherTestViewModel, Car>(); 
Mapper.CreateMap<Car, AnotherTestViewModel>(); 
var newCar = Mapper.Map<AnotherTestViewModel, Car>(model); 

Qualche idea?

risposta

21

Il modello di vista non deve interagire con il database. Visualizza I modelli dovrebbero essere usati solo nel livello di presentazione (interfaccia utente) - da qui il termine "Visualizza" modello. Dovresti avere un altro modello (modello di dati) che interagisce con il tuo database. Quindi dovresti avere un qualche tipo di livello di servizio che gestisca la tua conversione tra il tuo modello di visualizzazione e il tuo modello di dati (e viceversa). Il tuo modello di dati è il modello generato da Entity Framework (che presumo sia quello che stai utilizzando). Per gestire gli aggiornamenti del database, è necessario creare un'istanza di un contesto di dati, prelevare l'entità dati dal database, apportare modifiche a tale entità e richiamare le modifiche di salvataggio in tutto il contesto di dati. Il contesto dei dati tiene traccia di tutte le modifiche apportate alle entità e applica le modifiche necessarie al database quando si chiama "Salva modifiche". Esempio:

public void UpdateCar(CarViewModel viewModel) 
{ 
    using (DataContext context = new DataContext()) 
    { 
     CarEntity dataModel = context.CarEntities.where(x => x.Id == viewModel.Id).First(); 

     dataModel.Name = viewModel.Name; 
     dataModel.Type = viewModel.Type; 

     context.SaveChanges(); 
    } 
} 

In questo esempio, il contesto terrà traccia di eventuali modifiche "DataModel". Quando viene chiamato "context.SaveChanges", tali modifiche verranno automaticamente applicate al database.

+0

Grazie mille! Era esattamente l'aiuto di cui avevo bisogno. – Jim

+0

Dove vive questa funzione "UpdateCar"? Dici in una sorta di "Service Layer", puoi essere più preciso? Grazie! – crunchy

+0

In realtà il servizio non dovrebbe sapere nulla sull'interfaccia utente. Quindi questa conversione al tuo dominio/modello dati dovrebbe essere fatta nel tuo controller. Quindi si passa nel modello dominio/dati al metodo del livello di servizio che esegue l'aggiornamento. – RiceRiceBaby