2014-01-16 63 views
0

默认模型绑定器未映射模型中的集合。这里是我的代码:ASP.NET MVC 4.0模型绑定器与集合不起作用

型号:

public class Company 
{ 
    public string Name; 
    public List<CompanyActivity> Activities 
} 

public class CompanyActivity 
{ 
    public string Code; 
    public string Description 
} 

控制器:

[HttpPost] 
public ActionResult Index(Company company) {} 

查看/ HTML:

<input name="Name" type="text" value="some name" /> 
<input name="Activities[0].Code" type="text" value="1" /> 
<input name="Activities[0].Description" type="text" value="a" /> 
<input name="Activities[1].Code" type="text" value="2" /> 
<input name="Activities[1].Description" type="text" value="b" /> 

输入名称映射,但活动列表是空的。

+0

你给的HTML显示'值=“”'属性为空。当你提供价值时会发生什么?另外,你的MVC视图源是什么? – Dai

+0

我更新了我的代码 – jlp

回答

1

您有域定义你的模型,但你必须使用属性。你只需要改变你的模型如下:

public class Company 
{ 
    public string Name { get; set; } 
    public List<CompanyActivity> Activities { get; set; } 
} 

public class CompanyActivity 
{ 
    public string Code { get; set; } 
    public string Description { get; set; } 
} 

字段和属性之间的差异:Difference between Property and Field in C# 3.0+ASP.net MVC - Model binding excludes class fields?

+0

它没有帮助。 – jlp

+0

为什么?我用你的代码创建了一个工程。没有属性不绑定,并与属性正确绑定。 HTML是正确的,就像我说过的我只添加了{get; set;}并且它工作正常。 –

+0

有趣的我没有意识到modelbinder足够聪明,可以使用该名称语法来完成此操作。相比之下,我的回答并不完美。 – Oliver

0

名称必须相同的给他们建立一个集合/数组:

我想创建一个视图模型来处理这种情况,这就是为什么我几乎总是建立一个视图模型来处理视图呈现和MVC的特质。

型号

public class Company 
{ 
    public string Name; 
    public List<CompanyActivity> Activities 
} 

视图模型

public class CompanyViewModel 
{ 
    public string Name; 

    //View specific 
    public List<int> CompanyActivityCodes 
} 

查看

<input name="Name" type="text" value="" /> 
<input name="CompanyActivityCodes" type="text" value="" /> 
<input name="CompanyActivityCodes" type="text" value="" /> 

这一操作将绑定CompanyActivityCodes属性,然后可以重新分配这些属性以在控制器中构建活动属性。

public ActionResult Index(CompanyViewModel companyViewModel) 
{ 
    var company = new Company { Name = companyViewModel }; 
    company.Activities = companyViewModel.CompanyActivityCodes.Select(x => new CompanyActivity { Code = x }); 
} 
+0

我更新了我的代码。活动是对象列表,而不是整数列表。 – jlp

+0

是的,但它不是那么聪明,它可以找出使用集合时的嵌套属性。 – Oliver

+0

我的理解是,modelbinder不够先进,但要在处理集合时找出嵌套属性。 由于这个原因,我创建了一个ViewModel,它将您将CompanyActivity类“扁平化”为一个扁平类。 正如您所看到的,我已命名属性CompanyActivityCodes,因为它会展平活动集合中的代码属性。 您已编辑该问题以包含使事情复杂化的其他属性。 – Oliver

0

它shoould是

<input name="company.Activities[0].Code" type="text" value="" />