如何在mvc3中将对象列表从视图传递到控制器?

时间:2013-01-31 13:28:44

标签: asp.net asp.net-mvc

public class EmployeeViewModel
    {
        public Employee Employee { get; set; }
        public IList<Address> Addresses { get; set; }
    }

控制器: -

[HttpPost]
    public ActionResult InsertAddress(EmployeeViewModel model)
    {
           //code for insert data into db
    }

查看: - enter image description here

这里我想通过将多个地址对象和单个员工对象从视图传递给控制器​​来调用InsertAddress操作。

有可能吗?

3 个答案:

答案 0 :(得分:3)

您只需要使用正确的模型绑定器命名约定来理解。

Property.Property

或者

属性[index]。集合的属性

如果index不是基于顺序0,则需要添加隐藏字段,Property.Index和索引值

示例:

<input name="Employee.Name" value="1234 5678"/>
<input name="Employee.Phone value="1234 5678"/>
<input name="Employee.Email" value="me@example.com"/>
<input name="Addresses.Index" value="0" type="hidden"/>
<input name="Addresses[0].Suburb" value="Melbourne"/>
<input name="Addresses[0].Postcode" value="3000"/>
<input name="Addresses.Index" value="1" type="hidden"/>
<input name="Addresses[1].Suburb" value="Sydney"/>
<input name="Addresses[1].Postcode" value="2000"/>

插入行时,只需使用命名约定,不要忘记添加.Index字段。

如果为Address类创建自定义EditorTemplate,大多数默认的EditorFor将透明地为您处理所有这些。

答案 1 :(得分:2)

是的,但是你需要做一些工作。

您不需要为模型创建单个视图(使用地址的某种循环),而是需要为Address类创建EditorTemplate,然后在主视图中使用@Html.EditorFor(m => m.Addresses)

此设置将导致您的EmployeeViewModel实例返回到包含完整地址列表的操作(而不是空的)。

答案 2 :(得分:0)

我在绑定复杂模型时提到了一些常见问题,请看这里 http://jayakarant.blogspot.de/2014/05/handling-complex-view-models-in-razor.html