2 回答
TA贡献1785条经验 获得超4个赞
为了在回发时绑定到模型,name表单控件的属性必须与模型属性匹配。使用foreach循环不会生成正确的名称属性。如果您检查html,您将看到多个实例
<input type="text" name="item.LeaveType" .../>
但为了绑定到您的模型,控件需要
<input type="text" name="LeaveDetailsList[0].LeaveType" .../>
<input type="text" name="LeaveDetailsList[1].LeaveType" .../>
考虑这个问题最简单的方法是考虑如何LeaveType在C#代码中访问属性的值
var model = new LeaveBalanceViewModel();
// add some LeaveBalanceDetails instances to the LeaveDetailsList property, then access a value
var leaveType = model.LeaveDetailsList[0].LeaveType;
由于您的POST方法将具有参数名称(例如model),只需删除前缀(model),这就是控件的name属性必须如何。为了做到这一点,你必须使用一个for循环(集合必须实现IList<T>)
for(int i = 0; i < Model.LeaveDetailsList.Count; i++)
{
@Html.TextBoxFor(m => m.LeaveDetailsList[i].LeaveType)
....
}
或使用自定义EditorTemplate(集合只需要实现IEnumerable<T>)
在 /Views/Shared/EditorTemplates/LeaveBalanceDetails.cshtml
@model yourAssembly.LeaveBalanceDetails
<tr>
<td>@Html.TextBoxFor(m => m.LeaveType)</td>
....
</tr>
然后在主视图中(不在循环中)
<table>
.... // add headings (preferably in a thead element
<tbody>
@Html.EditorFor(m => m.LeaveDetailsList)
</tbody>
</table>
最后,在控制器中
public ActionResult Edit(LeaveBalanceViewModel model)
{
// iterate over model.LeaveDetailsList and save the items
}
- 2 回答
- 0 关注
- 682 浏览
添加回答
举报