我正试图从数据库中删除工作。我没有走得太远。我试图使用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)
答案 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
的值将是所选选项的值