例如:
模型
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
人物编辑模板(PersonEditor.cshtml):
@model MvcApplication1.Models.Person
@Html.HiddenFor(x=>x.ID)
<label>First Name</label>
@Html.TextBoxFor(x=>x.FirstName)
<label>Last Name</label>
@Html.TextBoxFor(x=>x.LastName)
<br />
在我的主页上,我希望能够执行以下操作:
@model IList<MvcApplication1.Models.Person>
@using (Html.BeginForm())
{
@Html.EditorFor(x=>x,"PersonEditor")
}
并拥有表单中的所有元素,自动生成专有名称;而不是像我现在所做的那样遍历集合:
@using (Html.BeginForm())
{
for (int i = 0; i < Model.Count; i++)
{
@Html.EditorFor(x=>Model[i],"PersonEditor")
}
}
表单元素必须包含以下格式:
<input name="[0].ID" type="text" value="Some ID" />
<input name="[0].FirstName" type="text" value="Some value" />
<input name="[1].ID" type="text" value="Some x" />
<input name="[1].FirstName" type="text" value="Some y" />
等等......
因为在我的控制器中,我希望在表单发布时收到IList<Person>
。
我可以完全消除for循环吗?
现在,当我只做@Html.EditorFor(x=>x)
(没有循环,换句话说)时,我得到了这个例外:
传递到字典中的模型项是类型的 'MvcApplication1.Models.Person []',但这本字典需要一个 “MvcApplication1.Models.Person”类型的模型项。
答案 0 :(得分:3)
您应该能够为IEnumerable<T>
和T
使用相同的模板。 Templating足以枚举IEnumerable,但您需要重命名编辑器模板以匹配类型名称。然后你应该可以使用
@model IList<MvcApplication1.Models.Person>
@using (Html.BeginForm())
{
@Html.EditorForModel()
}
不幸的是,它看起来像一个名为除类型名称以外的任何名称的模板将引发异常
传递到字典中的模型项是类型的 'MvcApplication1.Models.Person []',但这本字典需要一个 模型项'MvcApplication1.Models.Person'