Как импортировать данные из чекбокса (html) в базу ASP. NET Core MVC - PullRequest
0 голосов
/ 03 августа 2020

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

Для этого у меня есть две таблицы с отношением «один ко многим». В первой таблице (гости) у меня есть информация о гостях, а во второй таблице (PartyGests) есть еще два столбца для ссылки на другие данные.

После того, как пользователь создаст вечеринку, появится список появятся гости, в которых пользователь сможет выбрать, кого он хочет пригласить, установив флажки. При нажатии на кнопку «Отправить» все выбранные идентификаторы гостей передаются контроллеру.

Вот мое представление.

            <table class="table">
                <thead class="thead-dark">
                    <tr>
                        <th scope="col">First</th>
                        <th scope="col">Last</th>
                        <th scope="col">Operation</th>
                    </tr>
                </thead>

                <tbody>

                    @foreach (var item in ViewBag.Guests)
                    {
                        <tr>
                            <td>@item.FirstName</td>
                            <td>@item.LastName</td>
                            
                            <td><input type="checkbox" name="guests" value="@item.Id"></td>
                        </tr>
                    }


                </tbody>

            </table>
            <input type="hidden" value="@Model.Id" name="eventId"/>
            <button type="submit" class="btn btn-primary">Invite</button>
        </form>

Вот мой контроллер:

[HttpGet]
        public IActionResult Invite(int id)
        {
            ViewBag.Guests= _guestService.GetGuests(); //Display list of guests for invitation
            ViewBag.Id = id;

            return View(_eventService.GetEvent(id));    // Return event to get the event information o the Invite page
        }

        [HttpPost]
        public IActionResult Invite(int eventId, string[] guests)
        {
            foreach (var item in guests)
            {
                var newGuest = new EventGuest
                {
                    EventId = eventId,
                    GuestId = int.Parse(item)
                };

                // LINQ -- To avoid invite a guest more than once
                if (_eventService.IsInvited(newGuest.GuestId, eventId))  // Does not invite
                {
                    return RedirectToAction("Error", "Something");  // Give an error message
                }
                else
                {
                    _eventService.InviteGuest(newGuest);
                    _eventService.SaveChanges();
                }
            }
            return View("Index", "Home");
        }

Теперь, проблема в том, что я хочу, чтобы флажки приглашенных гостей были отмечены, когда они уже приглашены. Другими словами, если руководитель группы хочет добавить больше, он сможет распознать приглашенных гостей, посмотрев на отмеченные флажки.

Я должен отметить, что моя база данных получает действительные данные в своих столбцах с помощью этой операции

Я не знаком с JavaScript, поэтому, пожалуйста, помогите мне с HTML.

Спасибо

1 Ответ

0 голосов
/ 04 августа 2020

Первое, что следует отметить, это то, что у вас есть строковый массив для гостей в действии, но я подозреваю, что это должен быть массив целых чисел. У вас также может быть общий c список целых чисел, который также должен работать.

Следующее сработало для меня - обратите внимание, что если флажки не отмечены, то список идентификаторов пуст

<form method="post" asp-area="YourArea" asp-controller="YourController" asp-action="Test">
    <button type="submit">Post</button>
    <input type="hidden" value="123" name="eventId" />
    @for (int index = 0; index < Model.Count; index++)
    {
        <input type="checkbox" name="checkedIdList" value="@Model[index].Id" />
    }
</form>
        
            
[HttpPost]
public async Task<IActionResult> Test(int eventId, List<int> checkedIdList)
{
    await Task.CompletedTask;
            
    return RedirectToAction("Index");
}
...