Post上没有填充模型

时间:2013-03-15 14:35:52

标签: asp.net-mvc-4

我在局部视图中有这个

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

1 个答案:

答案 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);
    ...
}