如何在IEnumerable类型的Razor视图中访问模型属性?

时间:2011-12-28 05:07:26

标签: asp.net-mvc asp.net-mvc-3

如何在不使用循环的情况下访问IEnumerable类型的Razor视图中的Model属性(如@Html.EditorFor(x=>Model.Name))?I.e如果视图被强类型化为某个模型保持模型作为LIST。
例如。

@model IEnumerable<EFTest2.DAL.package_master>


那么是否可以在不使用foreach循环的情况下显示TestBoxFor或EditorFor(创建新模型)Html助手。???

2 个答案:

答案 0 :(得分:2)

当某个模型属性的类型为IEnumerable<SomeType>时,您通常会定义一个编辑器/显示模板(~/Views/Shared/EditorTemplates/SomeType.cshtml~/Views/Shared/DisplayTemplates/SomeType.cshtml)。将为集合的每个元素自动呈现此模板,以便您不需要编写循环:

@Html.EditorFor(x => x.SomeCollection)

在模板内部,您将能够访问各个属性:

@model SomeType
@Html.EditorFor(x => x.Name)
...

现在,如果您绝对需要直接访问强类型为IEnumerable<SomeType>的视图中的某个元素,则最好使用其他集合类型,例如IList<SomeType>SomeType[]作为视图这个模型可以让你通过索引直接访问元素,你可以这样做,例如访问集合的第6个元素:

@model IList<SomeType>
@Html.EditorFor(x => x[5].Name)

答案 1 :(得分:0)

所以基本上你提到了List等类型。

如果要将值添加到接受来自表单字段的用户输入的列表,然后添加到模型中的现有列表。

是最容易但不那么优雅的方式

假设您有“Person”类,然后在模型中使用List。首先创建一个具有空人实例的人的实例,将其添加到列表中,然后将最后一个列表项绑定到编辑中。

@{
    Person contact = new Person(); //Empty person instance
    PersonList.Add(contact);
     } 

稍后将此绑定到您的感应字段

 @Html.TextBoxFor(m => m.PersonList[PersonList.Count - 1].PrimaryContacts.FirstName)

这适用于模型属性的验证以及每个表单提交之后,对于下一个包含,您只需添加新人。 但如果表单被取消,请注意删除代码。