为什么我的HttpPost操作方法没有从视图中接收List <model>

时间:2019-10-20 22:36:30

标签: c# asp.net-core-mvc

我创建了一个表单,用于编辑笔记列表。表单显示每个注释的ID及其包含的消息。这行得通。

问题在于,在更改了这些注释中的消息并提交更改后,将发送表单,但是我从HttpPost操作方法参数中收到模型的空列表。

我浏览了许多类似的问题,但是一个常见的问题是视图模型不包含公共属性。我的我看不出问题出在哪里。我是编程的初学者,因此如果问题太明显,我深表歉意。

//我的视图模型

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

//我的帖子操作方法

[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");
}

//我的视图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 个答案:

答案 0 :(得分:2)

此:

@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]属性时。

答案 1 :(得分:0)

您应该在视图侧使用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>

我不知道为什么,但这是可行的。

干杯