在下拉列表中导航 属性

Navigation property in a dropdown list

我目前正在学习接口和存储库模式,并且在我的简单项目中遇到 CRUD 操作方面的困难。

我有域名class"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; }
}

和一个域 class "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; }
}

和实现该接口的 class "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 class 正在关注

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" 中为车辆模型执行此操作。当用户想要添加新车型时,他应该在文本框中输入新车型的名称,然后他应该在下拉列表 select 中输入属于该车型的车型。我不知道如何使用存储库模式实现这一点,我们将不胜感激。

将新的 属性 添加到 VehicleModelViewModel class 以保存车辆品牌下拉列表的可用选项列表。

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 操作中,创建此视图模型的对象,从 Makes

列表中加载 Makes 属性
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();
    }  
}

现在在您的视图中,它是强类型视图模型,我们将使用 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 操作方法来处理表单提交并将数据保存回您的 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);
}