Enregistrement Viewmodel de données pour la Base de données dans ASP.NET MVC
Je suis nouvelle ASP.net MVC et je suis à l'aide d'un viewmodel plutôt que viewbags à remplir mes listes déroulantes depuis que j'ai vu la plupart des gens recommandent contre eux. J'ai une nappe de pétrole de l'INTERFACE utilisateur qui ne les listes déroulantes en cascade et auto-complété (non montré ici) mais je n'arrive pas à récupérer mes données enregistrées dans la base de données.
Modèles:
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:
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; }
}
Contrôleur:
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();
}
J'ai vu quelques recommandations pour utiliser Automapper parce que EntityState.Modifié ne fonctionne pas, mais je ne suis pas sûr de savoir comment le configurer, car à l'aide du code ci-dessous ne fonctionne pas.
Mapper.CreateMap<AnotherTestViewModel, Car>();
Mapper.CreateMap<Car, AnotherTestViewModel>();
var newCar = Mapper.Map<AnotherTestViewModel, Car>(model);
Des idées?
OriginalL'auteur Jim | 2013-04-30
Vous devez vous connecter pour publier un commentaire.
Votre modèle de vue ne doit pas être en interaction avec la base de données. Les Modèles de vue doit être utilisé uniquement dans la couche de présentation (interface utilisateur) - d'où le terme de "Vue" modèle. Vous devriez avoir un autre modèle (modèle de données) qui interagit avec votre base de données. Ensuite, vous devez avoir un certain type de couche de service qui s'occupe de votre conversion entre votre modèle de vue et de votre modèle de données (et vice versa). Votre modèle de données est le modèle généré par Entity Framework (qui je suppose est ce que vous utilisez). Pour gérer les mises à jour de votre base de données, vous devez instancier un contexte de données, la saisie des données de l'entité à partir de votre base de données, de faire des changements à cette entité, et call enregistrer les modifications dans ce contexte de données. Le contexte de données permettra de garder une trace de toutes les modifications apportées à vos entités et d'appliquer les changements nécessaires à votre base de données lorsque vous appelez "enregistrer les modifications".
Exemple:
Dans cet exemple, le contexte sera de garder trace de tout changement de "modèle de données". Quand "le contexte.SaveChanges" est appelée, ces changements seront appliqués automatiquement à la base de données.
D'où vient cette "UpdateCar la fonction de" vivre bien? Vous dites, dans une sorte de "Couche de Service", pouvez-vous être plus précis? Merci!
Service effectivement ne sais rien à propos de l'INTERFACE utilisateur. Si cette conversion de votre nom de domaine/modèle de données doit être fait dans votre contrôleur. Ensuite, vous passez dans le domaine/modèle de données à votre service à la méthode de la couche qui effectue la mise à jour.
OriginalL'auteur RiceRiceBaby