一对多下拉列表建议

时间:2014-03-05 13:42:30

标签: c# asp.net asp.net-mvc razor

我很难弄清楚要走哪条路。 在我开始之前,这里有一些类:

public class Car
{
    [Key]
    [Required]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [Required]
    [MaxLength(255)]
    public string Title { get; set; }

    [Required]
    public DateTime Date{ get; set; }

    public virtual Category Category { get; set; }   
}

public class Category {
    [Key]
    [Required]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
    public int ID {get;set;}

    public Category Parent{get;set;}

    [Required]
    [MaxLength(255)]
    public string Title {get;set;}
}

因此,要创建一个新的“Car”,我只需要一个包含所有类别下拉列表的页面。为此,我写了一个新类并将其传递给“ActionResult Create”......

这是:

public class CarCreate
{
    public Car Car { get; set; }
    public List<Category> Categories
    {
        get
        {
            List<Category> list = new List<Category>();

            SystemContext sc = new SystemContext();

            list = sc.Categories.ToList();
            list.Insert(0, null);

            sc.Dispose();

            return list;
        }
    }
}

从控制器我传递了它:

    public ActionResult Create()
    {
        return View(new CarCreate());
    }

在视图中,我在CarCreate类中为List创建了一个下拉列表:

 <div class="col-md-4">
        @Html.LabelFor(t => t.Car.Title)
        @Html.TextBoxFor(model => model.Car.Title, new { @class = "form-control" })
    </div>

  <div class="col-md-4">
        @Html.LabelFor(t => t.Car.Category)
        @Html.DropDownListFor(model => model.Car.Category, new SelectList(Model.Categories, "ID", "Title","Select"), new { @class = "form-control" })
    </div>

当我检查处理回发的ActionResult中的Car.Category时:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(CarCreate emc)
    {
       Response.Write(emc.Car.Title);
        Response.Write(emc.Car.Category== null ? "null" : "notnull");
        return View(new CarCreate());
    }

我可以获得头衔。但是类别总是为空。

从回发中获取类别我需要做些什么?

3 个答案:

答案 0 :(得分:2)

我相信这是因为你的分类不是真实的。尝试在Car构造函数中添加它:

public class Car
{   
     public Car() 
     {
           this.Category = new Category();
     }
}

希望它有所帮助!

答案 1 :(得分:1)

DropDownListFor映射的值由select中选择的选项定义。 您尝试在复杂对象中设置此值。

我认为你应该有像

这样的东西
 public class Car
 {
    [Key]
    [Required]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [Required]
    [MaxLength(255)]
    public string Title { get; set; }

    [Required]
    public DateTime Date{ get; set; }

    public virtual int CategoryID { get ; set;}

    public virtual Category Category { get; set; }

 }

并且

<div class="col-md-4">
        @Html.LabelFor(t => t.Car.Category)
        @Html.DropDownListFor(model => model.Car.CategoryID, new SelectList(Model.Categories, "ID", "Title","Select"), new { @class = "form-control" })
</div>

答案 2 :(得分:0)

我会尽可能保持我的视图模型。只需在视图中保留您真正需要的属性即可。此外,我更喜欢将它们保留为简单的POCO(不包含数据加载逻辑),以便我可以在很多地方使用它。

public class CreateCarVM
{
  [Required]
  public string Title { set;get;}
  public List<SelectListItem> Categories { set;get;}
  [Required]
  public int SelectedCategory { set;get;}
  public CreateCarVM()
  {
    Categories =new List<SelectListItem>();
  }
}

并在我的创建操作方法中

public ActionResult Create()
{
  var vm=new CreateCarVM();
  vm.Categories=GetCategories();
  return View(vm);
}
private List<SelectListItem> GetCategories()
{
  var list=new List<SelectListItem>();
  //2 items hard coded for demo. You may load it from db
  list.Add(new SelectListItem { Value="1", Text="Sedan"});
  list.Add(new SelectListItem { Value="2", Text="SUV"});
  return list;
}

并在您的视图中强选键入CreateCarVM

@model CreateCarVM
@using(Html.BeginForm())
{
 @Html.TextBoxFor(s=>s.Title)
 @Html.DropDownListFor(s=>s.SelectedCategory,Model.Categories,"Select")
 <input type="submit" />
}

现在发布表单时,您可以检查viewmodel的SelectedCategory属性

[HttpPost]
public ActionResult Create(CreateCarVM model)
{
  if(ModelState.IsValid)
  {
    //check for model.SelectedCategory now
   // to do :Save and Redirect (PRG pattern)
  }
  model.Categories=GetCategories();
  return View(model);
}