我有一个具有List类型属性的模型。我使用此属性在我的视图上显示值。我使用foreach循环遍历列表中的每个项目并使用DisplayFor和TextBoxFor显示它们。那部分工作正常;之前我使用过TextBoxFor,任何用户输入的文本都会在提交时转到模型。但是,使用列表时,提交表单时列表为空。模型中的所有其他属性都已更新,我可以正确访问它们。什么阻止列表绑定,我该如何解决?
ModelInstrumentListingDetail
public class ModelInstrumentListingDetail
{
public int InstrumentTagID { get; set; }
public string InstrumentTagDescription { get; set; }
public List<ModelInstrumentListingItem> items { get; set; }
}
ModelInstrumentListingItem
public class ModelInstrumentListingItem
{
public string Field { get; set; }
public string Label { get; set; }
}
查看
@model GPC.Models.ModelInstrumentListingDetail
@using (Html.BeginForm("InstrumentListingAdd", "Home", FormMethod.Post, new { id = "InstrumentListingDetailForm" }))
{
<table>
<tr>
<td>
@Html.TextBoxFor(m => m.InstrumentTagDescription)
</td>
</tr>
@foreach (GPC.Models.ModelInstrumentListingItem item in Model.items)
{
<tr>
<td>
@Html.DisplayFor(m => item.Label)
</td>
<td>
@Html.TextBoxFor(m => item.Field)
</td>
</tr>
}
</table>
<input id="submitInstrumentListingAdd" name="submitInstrumentListingAdd" value="Add" type="submit" class="SaveButton" />
}
控制器
[HttpPost]
public ActionResult InstrumentListingAdd(ModelInstrumentListingDetail model, string submitInstrumentListingAdd)
{
...
}
在提交时,发布到控制器的模型的InstrumentDescription具有值,但items为null。我需要弄清楚如何使用新值填充项目。
答案 0 :(得分:3)
像这样更改循环:
@for(int idx = 0;idx < Model.items.Count;idx++)
{
<tr>
<td>
@Html.DisplayFor(_ => Model.items[idx].Label)
</td>
<td>
@Html.TextBoxFor(_ => Model.items[idx].Field)
</td>
</tr>
}
这样做的原因是<input>
元素将如下生成:
<input id="Items_0_" name="Items[0]" type="text" value="Foo">
<input id="Items_1_" name="Items[1]" type="text" value="Bar">
当您发布数据时,正如以下内容将在正文中:
Items[0]:Foo
Items[1]:Bar
默认的ASP.NET MVC模型绑定器将从请求正文中选择这些Items
并将它们应用于viewmodel,在您的情况下ModelInstrumentListingDetail.items
答案 1 :(得分:1)
如果要正确绑定列表,则应使用EditorTemplates
和EditorFor
助手或for
循环。 Here is an example.
如果您使用for
循环,它应该是这样的:
@for (int i = 0; i< Model.items.Count(); i++)
{
<tr>
<td>
@Html.DisplayFor(m => Model.items[i].Label)
</td>
<td>
@Html.TextBoxFor(m => Model.items[i].Field)
</td>
</tr>
}
for
循环 - 简短的方法,但使用EditorTemplate
- 更干净的解决方案,所以我推荐。
答案 2 :(得分:0)
我想我之前遇到过类似的问题。
也许试试:
[HttpPost]
public ActionResult InstrumentListingAdd([Bind(Prefix = "item")]ModelInstrumentListingItem model, string submitInstrumentListingAdd)
{
...
}