Как отслеживать идентификаторы связанных записей в ядре ASP. Net для обновления дочерних записей - PullRequest
0 голосов
/ 08 мая 2020

Я новичок в asp. net core и начинающий программист. Я занимаюсь созданием приложения, которому требуется страница, которая обновляет элементы и дочерние элементы на той же странице. Обновить родительские данные просто, но я немного не понимаю, как обновлять дочерние элементы.

Вот упрощенная модель элементов и дочерних элементов:

public class Test
{
    public int ID { get; set; }
    public string Name { get; set; }
    public ICollection<TestChild> TestChildren { get; set; }
}

public class TestChild
{
    public int ID { get;set; }
    public string ChildName { get;set; }
    public int TestID { get;set; }
    public Test Test {get; set; }
}

Я визуализирую это для пользователя на веб-странице Razor с использованием кода, аналогичного этому:

...
    <input asp-for="Test.Name" class="form-control" />
    @foreach (var child in Model.Test.TestChildren)
    {
        <input name="TC.@child.ID" value="@child.ChildName">
    }
...

Мой план состоял в том, чтобы использовать поле Name в дочернем поле ввода, чтобы вернуть идентификатор каждой дочерней записи, и это вместе с полем значения позволит мне обновить правильную запись. Это означает, что когда форма была отправлена, возвращенные данные могут быть похожи на следующие:

TC.4 = "Child 1"
TC.6 = "Child 2"
TC.9 = "Child 3"

Где .X - это идентификатор связанного дочернего элемента, а имя - это новое / обновленное имя. На самом деле я бы хотел каким-то образом вернуть словарь, где ключ - это идентификатор, а значение - это имя.

Однако, если я использую приведенный выше код при публикации формы, я не знаю, какой тип объявить переменную как, которая передается в функцию onpost, как показано ниже:

public async Task<IactionResult> OnPostAsync(int id, ???????????)
{
    ...
    What variable type should I use to map to the data above?
} 

Итак, мои вопросы:

  1. Это лучший способ обновления дочерних записей?
  2. Это более простой / лучший способ связать идентификатор и значение дочерних записей и передать их обратно в функцию onpost?
  3. Если то, что у меня есть, верно, что мне нужно объявить переменную как в онпосте?

Спасибо за помощь

1 Ответ

0 голосов
/ 09 мая 2020

Не думаю, что это лучший способ.

Вам не нужно добавлять параметр получения в метод post. Поскольку вы передаете на страницу данные Test, ваш код должен иметь поле типа Test, верно?

Вам нужно только убедиться, что при отправке представления модель относится к типу Test. Вы должны убедиться, что the name of children is consistent with the hierarchical relationship of the model.

И вам нужно add the ID field as a hidden field в представлении, чтобы подтвердить, какие данные вы обновляете.

Вот код:

 public class IndexModel : PageModel
    {
        private readonly MydbContext _context;

        public IndexModel (MydbContext context)
        {
            _context = context;
        }
        [BindProperty]
        public Test Test { get; set; }
        public void OnGet()
        {
            // here is an example to pass data to view.
            Test = _context.Test.Include(x => x.TestChildren).Where(x => x.ID == 5).FirstOrDefault();
        }

        public async Task<IActionResult> OnPostAsync()
        {
          //the Test parameter will change which is contains the value you changed.
           var newtest =   _context.Test.Include(x => x.TestChildren).Where(x => x.ID == Test.ID).FirstOrDefault();
            newtest.Name = Test.Name;
            newtest.TestChildren = Test.TestChildren;
            _context.SaveChanges();
            return Page();
        }
    }

Просмотр:

@page
@model WebApplication1_razor_page.IndexModel
@{
    ViewData["Title"] = "TestChild";
    Layout = "~/Pages/Shared/_Layout.cshtml";
    var i = 0;
}

<h1>Index</h1>
<form method="post">
    <input asp-for="Test.ID" class="form-control" hidden />
    <input asp-for="Test.Name" class="form-control" /> 
    @foreach (var child in Model.Test.TestChildren)
    {
        <input asp-for="@child.ID" name="Test.TestChildren[@i].ID"     hidden/>
        <input asp-for="@child.ChildName" name="Test.TestChildren[@i].ChildName"  />
        i++;
    }
    <input id="Submit1" type="submit" value="update" />
</form>

Вот результат теста:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...