0

我有这个部分视图

@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; }
     ...
}
4

1 回答 1

2

以下不做你认为它做的事:

new { model = Model.Items }

你不能像那样传递复杂的对象。如果您希望它起作用,您必须在表单中生成隐藏字段。

我在表格中添加了这个

@Html.HiddenFor(m => 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);
    ...
}
于 2013-03-15T15:10:32.053 回答