MVC4将模型绑定到ICollection或List in partial

给定一个模型

public class Task { public int TaskId { get; set; } public string Title { get; set; } public ICollection Information { get; set; } } 

哪里

 public class SomeData { public int SomeDataId { get; set; } public string Description { get; set; } } 

我有一个观点

 @model myProject.Models.Task 
@Html.LabelFor(model => model.Title)
@Html.Partial("_InformationEdit", Model.Information.ToList(), new ViewDataDictionary(Html.ViewDataContainer.ViewData) { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Information" }})

我的部分是

 @model IList @for (int i = 0; i < Model.Count(); i++) {   @Html.EditorFor(modelItem => Model[i].Description)   } 

然而

我的Html字段正在渲染

  

名称应为Information[0].Description 。 它有一个额外的点,因此在发布时不会正确绑定到模型。 我怎样才能解决这个问题?

根据模型绑定到列表,我可以看到我的Id应该是什么,但我无法弄清楚正确的语法。

另外,使用@foreachIEnumerable是否有更优雅的方法来实现这一目标?

有关:

ASP.Net MVC4将“创建视图”绑定到包含List的模型

ASP.NET MVC模型绑定IList 参数

您可以像这样直接使用

页:

  @Html.Partial("_InformationEdit", Model.Information) 

部分页面:

 @for (int i = 0; i < Model.Count(); i++) {      } 

或者,为了能够在示例中传递前缀,您可以保持页面代码相同并更改您的部分,如:

页:

  @Html.Partial("_InformationEdit", Model.Information, new ViewDataDictionary(Html.ViewDataContainer.ViewData) { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Information" } }) 

部分页面:

 @for (int i = 0; i < Model.Count(); i++) {   @{ string fieldName = string.Format("{0}[{1}].Description", ViewData.TemplateInfo.HtmlFieldPrefix, i);  }   } 

改变我的偏见

 @model IList @{ var Information = Model; } @for (int i = 0; i < Information.Count(); i++) {   @Html.EditorFor(modelItem => Information[i].Description)   } 

工作,但这似乎有点奇怪!

我想确保绑定的对象与它需要绑定的属性具有相同的名称做一些魔法…欢迎其他建议或解释!

你的部分应该是:

 @model IList @for (int i = 0; i < Model.Count(); i++) {   @Html.EditorFor(model => model[i].Description)   } 

如果用项目名称替换i,它也更容易阅读