为什么我无法将此模型传递给ASP.NET MVC中的控制器?
这是我的观点:
@model Pro.WebUI.ViewModels.DataItemVm
<div>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.FirstSetList.FirstOrDefault().Name)
</th>
<th>
@Html.DisplayNameFor(model => model.FirstSetList.FirstOrDefault().Amount)
</th>
</tr>
@foreach (var item in Model.FirstSetList)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.TextBoxFor(modelItem => item.Amount)
</td>
</tr>
}
</table>
<hr/>
<div>
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.FirstSetList)
<input type="submit" value="Confirm"/>
}
</div>
</div>
点击确认按钮后 - 此方法接收模型 Count = 0;
public ActionResult FirstSet(DataItemVm model)
{
...
}
当然,我的ViewModel DataItemVm 有列表:
public class DataItemVm
{
public List<FirstSetViewModel> FirstSetList { get; set; }
}
所以看起来这个问题只是在视野中。也许 BeginForm 应该在其他地方?但是 HiddenFor 应该足以发送此模型。
答案 0 :(得分:2)
将@foreach循环更改为for - ASP.NET MVC使用索引器为元素生成正确的ID和名称,因此您应该使用@ Html.TextBoxFor(x =&gt; x.Array [index])来正确生成html for你的收藏品。
这个周期:
@foreach (var item in Model.FirstSetList)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.TextBoxFor(modelItem => item.Amount)
</td>
</tr>
}
应该是这样的:
@for (var i = 0; i < Model.FirstSetList.Length; i++)
{
<tr>
<td>
@Html.DisplayFor(model => model.FirstSetList[i].Name)
@Html.HiddenFor(model => model.FirstSetList[i].Name) //otherwise name won't be returned to controller
</td>
<td>
@Html.TextBoxFor(model=> model.FirstSetList[i].Amount)
</td>
</tr>
}
另一个问题是 - 您希望发送到控制器的数据的标记应放在@using (Html.BeginForm()){//put it here}
块内。
查看这篇关于ASP.NET MVC中模型绑定的帖子: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/