1

例如:

模型

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

4

1 回答 1

3

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

@model IList<MvcApplication1.Models.Person>

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

不幸的是,看起来一个命名为除类型名称之外的任何其他名称的模板都会引发异常

传入字典的模型项的类型为“MvcApplication1.Models.Person[]”,但此字典需要类型为“MvcApplication1.Models.Person”的模型项

于 2013-01-31T20:22:29.563 回答