我一直在到处寻找,发现了很多问题,但他们都没有回答我的问题。
我想做的事情很简单,假设我们有这样的事情:
public class Parent
{
public int ID { get; set; }
public List<Child> Children { get; set; }
}
public class Child
{
public int ID { get; set; }
public int ParentID { get; set; }
public Parent Parent { get; set; }
}
EF 负责创建数据库并通过脚手架获得控制器和视图。一切正常,我可以创建父级。我还可以使用从下拉列表中选择的 ParentID 创建 Child。
我真正想做的是删除下拉菜单并将 ParentID 作为参数传递,如下所示:
public IActionResult Create(int id)
{
if (id == 0)
{
return NotFound();
}
ViewData["ID"] = id; //that a ParentID
return View();
}
鉴于我们得到了这个:
<form asp-action="Create">
<div class="form-horizontal">
<h4>Child</h4>
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="ParentID" value=@ViewData["ID"] />
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
</form>
提交时,我得到“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Children' 中插入标识列的显式值。” 现在我到处查看并尝试了各种属性,但我仍然无法让它工作。
我将不胜感激任何形式的帮助。
更新
从控制器创建方法:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,ParentID")] Child child)
{
if (ModelState.IsValid)
{
_context.Add(child);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(book);
}
只是为了展示更多关于问题的信息。在这里,我在视图中使用带有选择控件的默认脚手架版本。
public IActionResult Create(int id)
{
if (id == 0)
{
return NotFound();
}
ViewData["ParentID"] = new SelectList(_context.Parents.Where(x => x.ID == 1), "ID", "ID"); //Works
ViewData["ParentID"] = new SelectList(_context.Parents.Where(x => x.ID == id), "ID", "ID"); // Doesn't work
return View();
}