我的IEnumberable在我的操作中是一个空参数。自从我这样做以来,绑定不再起作用了:
之前我的重构
ListItem .cshtml位于列表 .html
内<table id="TeststepsDataTable">
<tbody>
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
@Html.HiddenFor(item => item[i].UnitId)
<td>
@Html.EditorFor(item => item[i].Name)
</td>
</tr>
}
</tbody>
</table>
AFTER 我的重构
列表 .cshtml
<table id="TeststepsDataTable">
<tbody>
@for (int i = 0; i < Model.Count(); i++)
{
Html.RenderPartial("ListItem", Model[i]);
}
</tbody>
</table>
列表项 .cshtml
@model ITMS.Web.Models.Teststep.TeststepViewModel
<tr>
@Html.HiddenFor(item => Model.UnitId)
<td>
@Html.EditorFor(item => Model.Name)
</td>
</tr>
单击List.cshtml中的保存按钮时,将触发此操作:
[HttpPost]
public ActionResult Save(IEnumerable<TeststepViewModel> teststepViewModels)
{
// do stuff
}
teststepViewModels为null因为我丢失了[0] .UnitId之类的索引属性,所以modelbinder无法正确绑定属性。
我该如何解决?
我真的想使用ListItem.cshtml,因为我想将此代码重用于插入/添加操作空行。
答案 0 :(得分:0)
你可以使用foreach代替
<table id="TeststepsDataTable">
<tbody>
@foreach (var item in Model)
{
Html.RenderPartial("ListItem", item);
}
</tbody>
</table>
并且你必须以这种方式绑定
<tr>
@Html.HiddenFor(item => item.UnitId)
<td>
@Html.EditorFor(item => item.Name)
</td>
和,锁定表达式 item =&gt; item.UnitId 而不是 item =&gt; Model.UnitId 强>
修改强> 的
我为模型添加了索引属性
public class UnitsViewModel
{
public List<Unit> Units { get; set; }
public class Unit
{
[HiddenInput(DisplayValue = false)]
public int UnitId { get; set; }
[DataType(DataType.MultilineText)]
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string ErrorText { get; set; }
public int Index { get; set; }
}
}
在主视图中我填充索引属性:
<table id="TeststepsDataTable">
<tbody>
@for (int i = 0; i < Model.Units.Count; i++)
{
Model.Units[i].Index = i;
Html.RenderPartial("ListItem", Model.Units[i]);
}
</tbody>
</table>
并在listItem中:
@model StackOverflowSample.Models.UnitsViewModel.Unit
@Html.Hidden("Units["+ Model.Index +"].UnitId",Model.UnitId)
<td>
@Html.TextBox("Units["+ Model.Index +"].Name",Model.Name)
</td>
<td>
@Html.TextBox("Units["+ Model.Index +"].ErrorText",Model.ErrorText)
</td>
我将编辑器更改为TextBox,将HiddenFor更改为Hidden.it的工作;)