使用Razor Pages更新一对多关系

时间:2018-03-29 18:35:39

标签: asp.net-core-2.0 razor-pages

我无法弄清楚如何使用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");
        });

1 个答案:

答案 0 :(得分:0)

我认为你还没有理解BindProperty是如何工作的。通过将BindProperty用于属性,您可以从框架中查询视图中可用属性的值,如果您有包含该值的输入,则在提交输入内容时它将返回到属性。

这意味着即使对于项目对象,如果没有可以托管模式值的输入,也不会获得值。

您有两种选择。第一个选项是为列表中的所有操作项输入输入,这不是一个好主意,第二个选项是在表单的子项后再次从数据库中查询列表。