【问题标题】:Navigation property in a dropdown list下拉列表中的导航属性
【发布时间】:2017-10-11 20:27:44
【问题描述】:

我目前正在学习接口和存储库模式,并且在我的简单项目中遇到 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”中做到这一点。当用户想要添加新车型时,他应该在文本框中输入新车型的名称,然后他应该在下拉列表中选择属于该车型的车型。我不知道如何使用存储库模式来实现这一点,我们将不胜感激。

【问题讨论】:

    标签: c# asp.net-mvc repository-pattern


    【解决方案1】:

    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 操作中,创建此视图模型的对象,从 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 操作方法,该方法处理表单提交并将数据保存回您的表格

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 2015-08-19
      • 2016-03-25
      • 2015-08-12
      相关资源
      最近更新 更多