我创建了一个表单,用于编辑笔记列表。表单显示每个注释的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.
}
答案 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>
我不知道为什么,但这是可行的。
干杯