我无法弄清楚如何使用Razor Pages asp.net core 2.0更新相关数据。
在下面的示例中,我可以更新"项目"数据,但我看不到相关的"行动" OnPostAsync()上的数据(一个项目=>多个动作)。
EditModel:PageModel
[BindProperty]
public Project Project { get; set; }
public async Task<IActionResult> OnGetAsync(int? id)
{
if (id == null)
{
return NotFound();
}
//THIS PART WORKS, I CAN SEE ACTIONS WITH THE PROJECT
Project = await _context.Project.Include(a=>a.Action).SingleOrDefaultAsync(m => m.Id == id);
if (Project == null)
{
return NotFound();
}
return Page();
}
public async Task<IActionResult> OnPostAsync(int? id)
{
//MODEL IS NOT RETURNING ACTIONS (One project many actions)
if (!ModelState.IsValid)
{
return Page();
}
//How do I update actions?
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ProjectExists(Project.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToPage("./Index");
}
OnModelCreating:
modelBuilder.Entity<Action>(entity =>
{
entity.HasOne(d => d.Project)
.WithMany(p => p.Action)
.HasForeignKey(d => d.ProjectId)
.HasConstraintName("FK_Action_Project");
});
答案 0 :(得分:0)
我认为你还没有理解BindProperty是如何工作的。通过将BindProperty用于属性,您可以从框架中查询视图中可用属性的值,如果您有包含该值的输入,则在提交输入内容时它将返回到属性。
这意味着即使对于项目对象,如果没有可以托管模式值的输入,也不会获得值。
您有两种选择。第一个选项是为列表中的所有操作项输入输入,这不是一个好主意,第二个选项是在表单的子项后再次从数据库中查询列表。