模型集合上的 ModelBinding
ModelBinding on model collection
我正在尝试创建一个非常简单的表单来 post 返回模型集合中的一些值
当我单击提交并查看返回的集合时,它不包含任何对象。我还发现 asp-for 没有生成我预期的集合索引。
我有一个简单的模型
public class CustomModel
{
public int Id { get; set; }
public string Question { get; set; }
public string Answer { get; set; }
}
这是我的观点
@model ICollection<CustomModel>
<form asp-action="Index" asp-controller="Home" method="POST">
<table>
@foreach (var m in Model)
{
<tr>
<td><label asp-for="@Model">@m.Question</label><input asp-for="@m.Answer"/></td>
</tr>
}
</table>
<input type="submit" value="save" />
呈现页面时的外观示例:
<tr>
<td><label>Your name?</label><input type="text" id="m_Answer" name="m.Answer" value="" /></td>
</tr>
<tr>
<td><label>Your Age?</label><input type="text" id="m_Answer" name="m.Answer" value="" /></td>
</tr>
这是我假设它会有一个索引,但它看起来像是将每一行视为一个单独的模型而不是模型的集合。
我在这里做错了什么?这是错误还是设计使然?
Github 测试项目
https://github.com/lasrol/TestModelBindingList
文档 here 建议变量名前不需要 @。您还可以通过将 th:
添加到标签
的开头来使用显式标签助手注释
@model ICollection<CustomModel>
<form asp-action="Index" asp-controller="Home" method="POST">
<table>
@foreach (var m in Model)
{
<tr>
<td><th:label asp-for="m.Answer">@m.Question</label><th:input asp-for="m.Answer"/></td>
</tr>
}
</table>
<input type="submit" value="save" />
</form>
将您的模型更改为 @model List<CustomModel>
而不是使用下一个方法
<form asp-action="Index" asp-controller="Home" method="POST">
<table>
@for (int i = 0; i < Model.Count; i++)
{
<tr>
<td>
<input type="hidden" asp-for="@Model[i].Id" />
<input type="hidden" asp-for="@Model[i].Question" />
<label asp-for="@Model[i].Question">@(Model[i].Question)</label>
<input asp-for="@Model[i].Answer" />
</td>
</tr>
}
</table>
<input type="submit" value="save" />
如您所见,您应该通过索引访问列表项以正确呈现输入的名称属性。也不要忘记通过隐藏输入包含其他项目属性,否则它的值将在 post 操作中丢失。
我正在尝试创建一个非常简单的表单来 post 返回模型集合中的一些值
当我单击提交并查看返回的集合时,它不包含任何对象。我还发现 asp-for 没有生成我预期的集合索引。
我有一个简单的模型
public class CustomModel
{
public int Id { get; set; }
public string Question { get; set; }
public string Answer { get; set; }
}
这是我的观点
@model ICollection<CustomModel>
<form asp-action="Index" asp-controller="Home" method="POST">
<table>
@foreach (var m in Model)
{
<tr>
<td><label asp-for="@Model">@m.Question</label><input asp-for="@m.Answer"/></td>
</tr>
}
</table>
<input type="submit" value="save" />
呈现页面时的外观示例:
<tr>
<td><label>Your name?</label><input type="text" id="m_Answer" name="m.Answer" value="" /></td>
</tr>
<tr>
<td><label>Your Age?</label><input type="text" id="m_Answer" name="m.Answer" value="" /></td>
</tr>
这是我假设它会有一个索引,但它看起来像是将每一行视为一个单独的模型而不是模型的集合。
我在这里做错了什么?这是错误还是设计使然?
Github 测试项目 https://github.com/lasrol/TestModelBindingList
文档 here 建议变量名前不需要 @。您还可以通过将 th:
添加到标签
@model ICollection<CustomModel>
<form asp-action="Index" asp-controller="Home" method="POST">
<table>
@foreach (var m in Model)
{
<tr>
<td><th:label asp-for="m.Answer">@m.Question</label><th:input asp-for="m.Answer"/></td>
</tr>
}
</table>
<input type="submit" value="save" />
</form>
将您的模型更改为 @model List<CustomModel>
而不是使用下一个方法
<form asp-action="Index" asp-controller="Home" method="POST">
<table>
@for (int i = 0; i < Model.Count; i++)
{
<tr>
<td>
<input type="hidden" asp-for="@Model[i].Id" />
<input type="hidden" asp-for="@Model[i].Question" />
<label asp-for="@Model[i].Question">@(Model[i].Question)</label>
<input asp-for="@Model[i].Answer" />
</td>
</tr>
}
</table>
<input type="submit" value="save" />
如您所见,您应该通过索引访问列表项以正确呈现输入的名称属性。也不要忘记通过隐藏输入包含其他项目属性,否则它的值将在 post 操作中丢失。