如何为集合创建Editor并避免执行循环

时间:2013-01-31 20:19:37

标签: asp.net-mvc asp.net-mvc-4 razor-2

例如:

模型

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”类型的模型项。

1 个答案:

答案 0 :(得分:3)

您应该能够为IEnumerable<T>T使用相同的模板。 Templating足以枚举IEnumerable,但您需要重命名编辑器模板以匹配类型名称。然后你应该可以使用

@model IList<MvcApplication1.Models.Person>

@using (Html.BeginForm())
{       
    @Html.EditorForModel()    
}

不幸的是,它看起来像一个名为除类型名称以外的任何名称的模板将引发异常

  

传递到字典中的模型项是类型的   'MvcApplication1.Models.Person []',但这本字典需要一个   模型项'MvcApplication1.Models.Person'