使用没有Magic String的ViewModels的MVC下拉列表

时间:2014-12-22 02:00:55

标签: c# asp.net-mvc entity-framework

我正试图从数据库中删除工作。我没有走得太远。我试图使用viewModel而不使用Magic String。我有一种感觉,我并不太远。请问一下,看看我错过了什么或做错了什么?

我在控制器的这一行收到编译错误:viewModel.Courts = CourtList,

我很确定这是错的,但我正在考虑如何做到这一点。

域模型:

 public class Parent
{

    public int ParentID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual Court Court { get; set; }
    //public IEnumerable<SelectListItem> Courts { get; set; }
    public virtual ICollection<Child> Childs { get; set; }

}

 public class Court
{
    public int CourtId { get; set; }
    public string CourtName { get; set; }

    public virtual ICollection<Parent> Parents { get; set; }
}

查看型号:

public class ParentVM
{

    public int ParentID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    //public int CourtId { get; set; }
    //public string CourtName { get; set; }

    public virtual Court Court { get; set; }
    //public virtual IEnumerable<Court> CourtList { get; set; }
    public IEnumerable<SelectListItem> Courts { get; set; }

    public IList<ChildVM> Children { get; set; } 

}

控制器:

// GET: Parents/Create
    public ActionResult Create()
    {

        IEnumerable<SelectListItem> CourtList = db.Courts.ToList().Select(x => new SelectListItem
        {
            Value = x.CourtId.ToString(),
            Text = x.CourtName,

        });



        //ViewBag.CourtList = new SelectList(db.Courts, "CourtId", "CourtName");

        ParentVM viewModel = new ParentVM()
        {
            Children = new List<ChildVM>()
            {
                new ChildVM(){Name="", DOB="", Address=""},
                //new ChildVM(){Name="2", DOB="2", Address="222"},
                //new ChildVM(){Name="3", DOB="3", Address="3"},                    
            },

            viewModel.Courts = CourtList,
        };

        return View(viewModel);

    }

    // POST: Parents/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(ParentVM viewModel)
    {
        if (ModelState.IsValid)
        {

            var parent = new Parent()
            {
                FirstName = viewModel.FirstName,
                LastName = viewModel.LastName
            };

            db.Parents.Add(parent);

            foreach (ChildVM item in viewModel.Children)
            {

                var child = new Child()
                {
                    Name = item.Name,
                    DOB = item.DOB,
                    Address = item.Address
                };

                db.Childs.Add(child);
            }

            //Parent parent = new Parent();              
            //var employee = AutoMapper.Mapper.Map<Parent, ParentVM>(parent);                        

            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(viewModel);
    }

查看:

@Html.DropDownList("Courts", (IEnumerable<SelectListItem>)Model.Courts)

1 个答案:

答案 0 :(得分:0)

您尝试将下拉列表绑定到属性Courts IEnumerable<SelectListItem><select>发回一个值类型(所选项的值),它不能绑定到集合。您需要一个额外的属性来绑定(或者您可以绑定到Court.CourtId,但CourtName的{​​{1}}属性不会在回发上绑定。

查看模型

Court

控制器

public class ParentVM
{
  public int ParentID { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  [Required]
  public int? SelectedCourt { get; set; } // bind the dropdown to this
  public SelectList CourtList { get; set; }
  public IList<ChildVM> Children { get; set; } 
}

查看

public ActionResult Create()
{
  ParentVM model = new ParentVM()
  {
    Children = new List<ChildVM>() .....,
    CourtList = new SelectList(db.Courts, "CourtId", "CourtName"),
    SelectCourt = // set a value here if you want a specific option to be selected
  });
  return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ParentVM model)
{
  if (ModelState.IsValid)
  {
    Court court = db.Courts.Find(model.SelectedCourt) // get the Court based on `SelectedCourt`
    var parent = new Parent()
    {
      FirstName = model.FirstName,
      LastName = model.LastName,
      Court  = court
    };
    db.Parents.Add(parent);
    foreach (ChildVM item in viewModel.Children)
    {
      ....
      db.Childs.Add(child);
    }
    db.SaveChanges();
    return RedirectToAction("Index");
  }
  model.CourtList = new SelectList(db.Courts, "CourtId", "CourtName"); // reassign select list
  return View(model);
}

如果@Html.DropDownListFor(m => m.SelectedCourt, Model.CourtList, "--Please select--") 的值与其中一个选项的值匹配,则在呈现页面时将选择该值,否则将选择第一个(标签)选项。回发后,SelectedCourt的值将是所选选项的值