Обновление отношений «один ко многим» с помощью Razor Pages

Я не могу понять, как обновить связанные данные с помощью Razor Pages asp.net core 2.0.

В приведенном ниже примере я могу обновить данные «Проекта», но не вижу связанных данных «Действия» (один проект => много действий) в OnPostAsync().

РедактироватьМодель: 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");
    }

Онмоделкреатинг:

    modelBuilder.Entity<Action>(entity =>
        {

            entity.HasOne(d => d.Project)
                .WithMany(p => p.Action)
                .HasForeignKey(d => d.ProjectId)
                .HasConstraintName("FK_Action_Project");
        });

person user797833    schedule 29.03.2018    source источник


Ответы (1)


Я думаю, вы не поняли, как работает BindProperty. Используя BindProperty для свойства, вы запрашиваете у платформы значение свойства, которое должно быть доступно в представлении, и в случае, если у вас есть ввод, содержащий значение, он вернется к свойству, когда вы отправите содержимое ввода.

Это означает, что даже для объекта проекта вы не получите значений, если у вас нет входных данных, на которых будут размещаться значения режима.

У вас есть два варианта. Первый вариант — ввести входные данные для всех ваших действий в списке, что не очень хорошая идея, а второй вариант — снова запросить список из базы данных после отправки формы.

person pitaridis    schedule 29.03.2018
comment
Я возвращаю значения для обоих вызовов, OnGetAsync и OnPostAsync. Однако в OnGetAsync я вижу значения как Project, так и Action, а в OnPostAsync я вижу (и могу обновлять) только Project. - person user797833; 30.03.2018