2017-10-11 112 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); 
}