ASP.NET Ядро: Модальный не передает значения в метод контроллера

#c# #html #razor #asp.net-core-mvc

#c# #HTML #бритва #asp.net-core-mvc

Вопрос:

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

  @foreach (var item in Model.Questions)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Id)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Question1)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReplyOptions)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Group)
            </td>
            <td>
                @if (item.CategoryId != null)
                {
                    @Html.DisplayFor(modelItem => item.Category.Name)
                }
                else
                {
                    <i><font color="red">Nicht zugewiesen</font></i>
                }
            </td>
            <td>
                <!-- Button trigger modal -->
                <button type="button" class="btn btn-sm" data-toggle="modal" data-target="#@item.Id">
                    Bearbeiten
                </button>

                <!-- Modal -->
                <div class="modal fade" id="@item.Id" tabindex="-1" role="dialog" aria-labelledby="xxx" aria-hidden="true">
                    <div class="modal-dialog" role="document">
                        <div class="modal-content">
                            <div class="modal-header">
                                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                    <span aria-hidden="true">amp;times;</span>
                                </button>
                                <h2 class="modal-title" id="xxx">Frage bearbeiten</h2>
                            </div>
                            <div class="modal-body">
                                <form asp-action="Edit">
                                    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                                    <input type="hidden" asp-for="@item.Id" />
                                    <div class="form-group">
                                        <label asp-for="@item.CategoryId" class="control-label"></label>
                                        <select asp-for="@item.CategoryId" class="form-control" asp-items="ViewBag.CategoryId"></select>
                                        <span asp-validation-for="@item.CategoryId" class="text-danger"></span>
                                    </div>
                                    <div class="form-group">
                                        <label asp-for="@item.Question1" class="control-label"></label>
                                        <input asp-for="@item.Question1" class="form-control" />
                                        <span asp-validation-for="@item.Question1" class="text-danger"></span>
                                    </div>
                                    <div class="form-group">
                                        <label asp-for="@item.ReplyOptions" class="control-label"></label>
                                        <input asp-for="@item.ReplyOptions" class="form-control" />
                                        <span asp-validation-for="@item.ReplyOptions" class="text-danger"></span>
                                    </div>
                                    <div class="form-group">
                                        <label asp-for="@item.Group" class="control-label"></label>
                                        <input asp-for="@item.Group" class="form-control" />
                                        <span asp-validation-for="@item.Group" class="text-danger"></span>
                                    </div>
                                    <div class="modal-footer">
                                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                                        <button type="submit" class="btn btn-primary">Save</button>
                                    </div>
                                </form>
                            </div>
                        </div>
                    </div>
                </div>
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
    }
  

Но у меня следующая проблема:
Когда я хочу отредактировать вопрос и нажать «Сохранить», мой метод редактирования в контроллере не получает значения.
Метод выглядит следующим образом:

Редактировать метод в моем контроллере (во время отладки)

Что мне нужно сделать, чтобы убедиться, что значения передаются?

Ответ №1:

Что мне нужно сделать, чтобы убедиться, что значения передаются?

Просто чтобы добавить атрибут name к каждому элементу управления в форме :

   <div class="modal-body">
                                <form asp-action="Edit">
                                    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                                    <input type="hidden" asp-for="@item.Id" name="Id" />
                                    <div class="form-group">
                                        <label asp-for="@item.CategoryId" class="control-label"></label>
                                        <select asp-for="@item.CategoryId" class="form-control" asp-items="ViewBag.CategoryId" name="CategoryId"></select>
                                        <span asp-validation-for="@item.CategoryId" class="text-danger"></span>
                                    </div>
                                    <div class="form-group">
                                        <label asp-for="@item.Question1" class="control-label"></label>
                                        <input asp-for="@item.Question1" class="form-control" name="Question1" />
                                        <span asp-validation-for="@item.Question1" class="text-danger"></span>
                                    </div>
                                    <div class="form-group">
                                        <label asp-for="@item.ReplyOptions" class="control-label"></label>
                                        <input asp-for="@item.ReplyOptions" class="form-control" name="ReplyOptions" />
                                        <span asp-validation-for="@item.ReplyOptions" class="text-danger"></span>
                                    </div>
                                    <div class="form-group">
                                        <label asp-for="@item.Group" class="control-label"></label>
                                        <input asp-for="@item.Group" class="form-control" name="Group" />
                                        <span asp-validation-for="@item.Group" class="text-danger"></span>
                                    </div>
                                    <div class="modal-footer">
                                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                                        <button type="submit" class="btn btn-primary">Save</button>
                                    </div>
                                </form>
                            </div>
                        
  

Вот результат теста:
введите описание изображения здесь

Комментарии:

1. Большое вам спасибо!! : D Но я хотел бы задать вам еще один вопрос: у меня также есть модал для создания вопроса, и там он также работает без атрибута «name». Зачем мне это нужно в этом случае?

2. @Toasty, asp-for автоматически сгенерирует name атрибут, ключ лежит в форме атрибута name . Ваше исходное кодовое имя автоматически генерирует значение item.filedName , но Question класс, принятый в действие, не имеет item внешнего поля, поэтому вам нужно добавить атрибут name, чтобы переопределить имя, автоматически сгенерированное asp-for . Случай, когда вы упомянули, что вы можете напрямую передавать данные, показывает, что имя, автоматически сгенерированное asp-for, согласуется со структурой классов, полученной в коде. Вы можете использовать F12 для просмотра отображаемого HTML-кода.