Почему мой метод действия HttpPost не получает List <model>из представления - PullRequest
0 голосов
/ 21 октября 2019

Я создал форму, которая редактирует список заметок. Форма отображает идентификатор каждой заметки вместе с сообщением, которое она содержит. Это работает.

Проблема в том, что после изменения сообщений в этих заметках и отправки изменений форма отправляется, но я получаю пустой список моделей из параметра метода действия HttpPost.

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

// Моя модель просмотра

public class NoteViewModel
{
    public int Id { get; set; }
    public string Message { get; set; }
}

// Метод My Post Action

[HttpPost]
public IActionResult EditNotes(List<NoteViewModel> model)
{   
    foreach (var item in model)
    {
        // Create a note, and copy values from model
        Note note = new Note
        {
            Id = item.Id,
            Message = item.Message
        };

        // Update note in database.
        noteRepository.Update(note);
    }
    return RedirectToAction("NotePage", "Home");
}

// My View EditNote.cshtml

@model List<MyWebsite.ViewModels.NoteViewModel>

<form asp-action="EditNotes" method="post">
    @foreach (var note in Model)
    {
        <label asp-for="@note.Id">@note.Id</label>
        <label asp-for="@note.Message">Message</label>
        <input asp-for="@note.Message" value="@note.Message" />
    }
    <button type="submit" class="btn btn-success">Submit</button>
</form>

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

public IActionResult EditNotes(List<NoteViewModel> model)
{
    // model is empty
    // model.Count() gives 0.
}

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

This:

@model List<MyWebsite.ViewModels.NoteViewModel>

<form asp-action="EditNotes" method="post">
    @foreach (var note in Model)
    {
        <label asp-for="@day.Id">@note.Id</label>
        <label asp-for="@note.Message">Message</label>
        <input asp-for="@day.Message" value="@day.Message" />
    }
    <button type="submit" class="btn btn-success">Submit</button>
</form>

Должно быть так:

@model List<MyWebsite.ViewModels.NoteViewModel>

<form asp-action="EditNotes" method="post">
    @for( Int32 i = 0; i < this.Model.Count; i++ ) {
        <label>@Model[i].Id</label>
        <input asp-for="@Model[i].Id" type="hidden" />
        <label asp-for="@Model[i].Message">Message</label>
        <input asp-for="@Model[i].Message" />
    }
    <button type="submit" class="btn btn-success">Submit</button>
</form>

Это связано с тем, что привязка модели ASP.NET Core MVC использует Expression<Func<TModel,TProperty>> для генерации атрибутов name=""Это означает, что ему нужно полное выражение, чтобы перейти от TModel к свойству, к которому он привязан.

Помощник по тегам также сгенерирует для вас атрибут value="", указывать его не нужновручную. То же самое относится и к тексту <label> (особенно если вы используете атрибуты [Display] или [DisplayName] в свойствах модели.

0 голосов
/ 21 октября 2019

Вы должны выполнить итерацию с блоком for на стороне просмотра. Например, посмотрите этот пример:

<form asp-action="EditBulk" , method="post">
    <table class="table">
        <thead>
            <tr>
                <th>
                    <label id="noteTextLbl">Note Text</label>
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @for (int i = 0; i < Model.Count; i++)
            {
                <tr>
                    <td>
                        <input asp-for="@Model[i].NoteId" type="hidden" />
                        <input asp-for="@Model[i].NoteText" />
                    </td>
                    <td>
                        <a asp-action="Edit" asp-route-id="@Model[i].NoteId">Edit</a> |
                        <a asp-action="Details" asp-route-id="@Model[i].NoteId">Details</a> |
                        <a asp-action="Delete" asp-route-id="@Model[i].NoteId">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
    <button type="submit">Send changes</button>
</form>

Я не знаю почему, но это просто работает.

Приветствия,

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