Asp.net-Mvc

在 ASP.NET MVC 中將 Viewmodel 數據保存到數據庫

  • April 30, 2013

我是 ASP.net MVC 的新手,我使用視圖模型而不是視圖包來填充我的下拉列表,因為我看到大多數人都反對它們。我有一個漂亮的使用者界面,可以進行級聯下拉和自動完成(此處未顯示),但我似乎無法將我的數據保存回數據庫。

楷模:

  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; }
   }

視圖模型:

public class AnotherTestViewModel
   {
       public Car car { get; set; }

       public IEnumerable<SelectListItem> CarModels { get; set; }
       public IEnumerable<SelectListItem> Manufacturers { get; set; }
       public IEnumerable<SelectListItem> CarColors { get; set; }
   }

控制器:

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();
       }

我看到了一些使用 Automapper 的建議,因為 EntityState.Modified 不起作用,但我不確定如何配置它,因為使用下面的程式碼不起作用。

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

有任何想法嗎?

您的視圖模型不應與數據庫互動。視圖模型應該只在表示層(使用者界面)中使用 - 因此術語“視圖”模型。您應該有另一個與您的數據庫互動的模型(數據模型)。然後你應該有某種類型的服務層來處理你的視圖模型和數據模型之間的轉換(反之亦然)。您的數據模型是實體框架生成的模型(我假設您正在使用它)。要處理對數據庫的更新,您需要實例化一個數據上下文,從數據庫中獲取數據實體,對該實體進行更改,然後在該數據上下文中呼叫 save changes。數據上下文將跟踪您的實體的所有更改,並在您呼叫“保存更改”時將必要的更改應用於您的數據庫。例子:

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();
   }
}

在此範例中,上下文將跟踪對“dataModel”的任何更改。當呼叫“context.SaveChanges”時,這些更改將自動應用於數據庫。

引用自:https://stackoverflow.com/questions/16306244