2017-10-11 3 views
0

J'apprends actuellement les interfaces et le modèle de référentiel et j'ai des difficultés avec les opérations CRUD dans mon projet simple.Propriété de navigation dans une liste déroulante

Je classe de domaine "VehicleMake"

public class VehicleMake 
{ 
    public VehicleMake() 
    { 

    } 

    [Key] 
    [Column(Order = 1)] 
    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    public virtual ICollection<VehicleModel> VehicleModels { get; set; } 
} 

et une classe de domaine "VehicleModel"

public class VehicleModel 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int Id { get; set; } 

    public int VehicleMakeId { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    public virtual VehicleMake VehicleMake { get; set; } 
} 

J'ai aussi une interface "IVehicleRepository"

public interface IVehicleRepository 
{ 
    void Add(VehicleMake vehicleMake); 

    IEnumerable<VehicleMake> AllMakes { get; } 
    IEnumerable<VehicleModel> AllModels { get; } 
} 

et une classe "VehicleRepository" qui implémente cette interface

public class VehicleRepository : IVehicleRepository 
{ 
    private readonly VehicleDbContext _context; 

    public VehicleRepository(VehicleDbContext context) 
    { 
     _context = context; 
    } 

    public void Add(VehicleMake vehicleMake) 
    { 
     _context.VehicleMakes.Add(vehicleMake); 
     _context.SaveChanges(); 
    } 

    public IEnumerable<VehicleMake> AllMakes => _context.VehicleMakes; 
    public IEnumerable<VehicleModel> AllModels => _context.VehicleModels; 
} 

Ma classe DbContext suit

public class VehicleDbContext : DbContext 
{ 
    public VehicleDbContext() : base("VehicleDbContext") 
    { 

    } 

    public DbSet<VehicleMake> VehicleMakes { get; set; } 
    public DbSet<VehicleModel> VehicleModels { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

    } 

} 

Mon "VehicleMakeViewModel" est la suite

public class VehicleMakeViewModel 
{ 
    [Required] 
    [Display(Name = "Vehicle Make Number")] 
    public int Id { get; set; } 

    [Required] 
    [Display(Name = "Vehicle Make Name")] 
    public string Name { get; set; } 
} 

et mon "VehicleModelViewModel" est suivant

public class VehicleModelViewModel 
{ 
    [Required] 
    [Display(Name = "Vehicle Model Number")] 
    public int Id { get; set; } 

    [Required] 
    [Display(Name = "Vehicle Model Name")] 
    public string Name { get; set; } 

    [Required] 
    [Display(Name = "Vehicle Make Id")] 
    public int VehicleMakeId { get; set; } 
} 

Je "VehicleMakeController"

public class VehicleMakeController : Controller 
{ 
    private readonly IVehicleRepository _vehicleRepository; 

    public VehicleMakeController() 
    { 
     _vehicleRepository = new VehicleRepository(new VehicleDbContext()); 
    } 

    // GET: VehicleMake 
    public ActionResult Index() 
    { 
     return View(_vehicleRepository.AllMakes); 
    } 

    public ActionResult CreateVehicleMake() 
    { 
     return View(new VehicleMakeViewModel()); 
    } 

    [HttpPost] 
    public ActionResult CreateVehicleMake(VehicleMakeViewModel viewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      var vehicleMake = new VehicleMake(); 
      UpdateVehicleMake(vehicleMake, viewModel); 
      _vehicleService.Add(vehicleMake); 
      return RedirectToAction("Index"); 
     } 

     return View(viewModel); 
    } 

    private void UpdateVehicleMake(VehicleMake vehicleMake, VehicleMakeViewModel viewModel) 
    { 
     vehicleMake.Id = viewModel.Id; 
     vehicleMake.Name = viewModel.Name; 
    } 
} 

et un « VehicleModelController

public class VehicleModelController : Controller 
{ 

    private readonly IVehicleRepository _vehicleRepository; 

    public VehicleModelController() 
    { 
     _vehicleRepository = new VehicleRepository(new VehicleDbContext()); 
    } 

    // GET: VehicleModel 
    public ActionResult Index() 
    { 
     return View(_vehicleRepository.AllModels); 
    } 


} 

Comme vous pouvez le voir dans mon « VehicleMakeController »J'ai des méthodes pour ajouter des nouvelles marques de véhicules « CreateVehicleMake ». Le problème est que je ne sais pas comment faire cela dans mon "VehicleModelController" pour les modèles de véhicules. Lorsque l'utilisateur souhaite ajouter un nouveau modèle de véhicule, il doit entrer un nom du nouveau modèle de véhicule dans la zone de texte, puis sélectionner dans la liste déroulante la marque de véhicule qui appartient à ce modèle de véhicule. Je ne sais pas comment implémenter ceci avec le modèle de dépôt et n'importe quelle aide serait appréciée.

Répondre

0

Ajoutez une nouvelle propriété à la classe VehicleModelViewModel pour contenir la liste des options disponibles pour la liste déroulante du véhicule.

public class VehicleModelViewModel 
{ 
    public List<SelectListItem> Makes { set;get;} 

    [Required] 
    [Display(Name = "Vehicle Model Name")] 
    public string Name { get; set; } 

    [Required] 
    [Display(Name = "Vehicle Make Id")] 
    public int VehicleMakeId { get; set; } 
} 

maintenant dans votre action GET pour l'écran de création, créez un objet de ce modèle de vue, charger la Makes propriété de la liste des marques

public class VehicleModelController : Controller 
{  
    private readonly IVehicleRepository _vehicleRepository;  
    public VehicleModelController() 
    { 
     _vehicleRepository = new VehicleRepository(new VehicleDbContext()); 
    }  

    public ActionResult Create() 
    { 
     var vm=new VehicleModelViewModel(); 
     vm.Makes = GetMakeOptions(); 
     return View(vm); 
    } 
    private List<SelectListeItem> GetMakeOptions() 
    { 
     return this._vehicleRepository.AllMakes 
       .Select(x=>new SelectListItem { Value=x.Id.ToString(), 
               Text=x.Name}) 
       .ToList(); 
    } 
} 

maintenant à votre avis, qui est fortement typée à votre modèle de vue, nous utiliserons la méthode d'aide Html.DropDownListFor pour générer l'élément SELECT

@model VehicleViewModel 
@using(Html.BeginForm()) 
{ 
    @Html.LabelFor(s=>s.Name) 
    @Html.TextBoxFor(s=>s.Name) 
    @Html.ValidationMessageFor(s=>s.Name) 

    @Html.LabelFor(s=>s.MakeId) 
    @Html.DropDownListFor(s=>s.VehicleMakeId , Model.Makes) 
    @Html.ValidationMessageFor(s=>s.VehicleMakeId) 

    <input type="submit" /> 
} 

Cela rend la vue avec l'élément SELECT à l'intérieur la forme. Assurez-vous que vous avez une méthode d'action HttpPost Create dans le contrôleur qui gère le formulaire de soumission et enregistre les données dans votre table

[HttpPost] 
public ActionResult Create(VehicleViewModel model) 
{ 
    if(ModelState.IsValid) 
    { 
    var e = new VehicleModel { Name = model.Name, VehicleMakeId = model.VehicleMakeId }; 
    _vehicleRepository.Add(e); 
    return RedirectToAction("Index"); 
    } 
    model.Makes=GetMakes(); 
    return View(model); 
}