我在局部视图中有这个
@using (Html.BeginForm(MVC.Inventory.ActionNames.AddVehicles, MVC.Inventory.Name, new { model = Model.Items }))
{
<div><button>@AuctionControllerResource.AddToBiddingProcess</button></div>
}
post方法就是这个
[HttpPost]
public virtual ActionResult AddVehicles(List<VehicleViewModel> model)
{
return null;
}
当我在视图中放置断点时,我可以看到Model.Items中有1个项目应该如此。但是,当我按下按钮时点击Post动作方法时,模型中没有项目。
我已将此格式添加到
中@Html.HiddenFor(m => m.Items)
但它没有帮助。
我做错了什么?
感谢,
萨钦
修改
附加代码
public class ListViewModel<T> : IQuery
where T : class
{
public List<T> Items { get; set; }
...
}
答案 0 :(得分:2)
以下不符合您的想法:
new { model = Model.Items }
你不能传递那样的复杂对象。如果您希望这样做,则必须在表单中生成隐藏字段。
我已将此格式添加到
中@ Html.HiddenFor(m =&gt; m.Items)
不,这没有用,这是正常的。隐藏字段仅适用于简单类型。您必须遍历集合中的项目并为每个元素的每个属性生成相应的字段:
@using (Html.BeginForm(MVC.Inventory.ActionNames.AddVehicles, MVC.Inventory.Name))
{
for (var i = 0; i < Model.Items.Count; i++)
{
@Html.HiddenFor(x => x.Items[i].Prop1)
@Html.HiddenFor(x => x.Items[i].Prop2)
@Html.HiddenFor(x => x.Items[i].ComplexProp3.Prop1)
@Html.HiddenFor(x => x.Items[i].ComplexProp3.Prop2)
...
}
<div>
<button>@AuctionControllerResource.AddToBiddingProcess</button>
</div>
}
但这似乎很浪费。由于用户无法在表单中修改这些值,我建议您只需传递一个id,以便在POST操作中从数据存储中检索相应的项目:
@using (Html.BeginForm(MVC.Inventory.ActionNames.AddVehicles, MVC.Inventory.Name, new { id = Model.ItemsId }))
{
<div>
<button>@AuctionControllerResource.AddToBiddingProcess</button>
</div>
}
然后:
[HttpPost]
public virtual ActionResult AddVehicles(int id)
{
List<VehicleViewModel> model = GetItemsFromDataStore(id);
...
}