2017-10-11 114 views
0

我目前正在学习接口和存储库模式,并在我的简单项目中遇到与CRUD操作有关的问题。下拉列表中的导航属性

我有域类 “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; } 
} 

和域类 “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; } 
} 

我也有一个接口 “IVehicleRepository”

public interface IVehicleRepository 
{ 
    void Add(VehicleMake vehicleMake); 

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

和一类“VehicleRepository”实现该接口

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

我的DbContext类以下

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) 
    { 

    } 

} 

我 “VehicleMakeViewModel” 是继

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

和我的 “VehicleModelViewModel” 是继

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

我有 “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; 
    } 
} 

和“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); 
    } 


} 

正如你可以看到我的‘VehicleMakeController’我对加入新车型的方式使‘CreateVehicleMake’。问题是我不知道如何在车辆模型的“VehicleModelController”中做到这一点。当用户想要添加新车型时,他应该在文本框中输入新车型的名称,然后他应该在下拉列表中选择属于该车型的车型。我不知道如何使用存储库模式实现这一点,任何帮助将不胜感激。

回答

0

VehicleModelViewModel类添加一个新的属性,以保存车辆下拉的可用选项列表。

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; } 
} 
在为创建屏幕上,创建这种观点模型的对象的GET动作

现在,从使得

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

现在,在您的视图列表中,这是强类型的加载Makes财产您的视图模型,我们将使用Html.DropDownListFor辅助方法来生成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" /> 
} 

,这会使得里面的SELECT元素的观点表格。确保在控制器中有一个HttpPost Create操作方法,该方法处理表单提交并将数据保存回您的表格

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