如何将ICollection <t>编入索引,就像他们在此示例中告诉我的那样?

时间:2016-04-25 20:43:07

标签: c# asp.net-mvc asp.net-mvc-5

我在MVC视图中尝试列表项,遵循此示例:Model Binding to a List。我使用的是MVC 5.例子说这样做:

<%@ Page Inherits="ViewPage<IList<Book>>" %>
<% for (int i = 0; i < 3; i++) { %>
    <%: Html.EditorFor(m => m[i]) %>
<% } %>

我试图这样做:

for (int i = 0; i < Model.SubmissionTypesSelected.Count(); i++)
{
    Html.EditorFor(m => m.SubmissionTypesSelected[i]);
}

SubmissionTypesSelected的定义如下:

public ICollection<PTSubTypeSelected> SubmissionTypesSelected { get; set; }

我收到此消息:

  

无法将索引应用于&#39; System.Collections.Generic.ICollection&#39;

类型的表达式

3 个答案:

答案 0 :(得分:1)

错误有点不言自明;您无法在ICollection{T}上使用索引,因为它旨在能够修改元素集合的内容,而不是它们的顺序。将其更改为IList{T}只是一个简单的答案,就像您链接的示例一样。

MVC需要在HTML中添加索引,以便它可以确定哪些属性值与回发中集合中的哪个项目相关。如果您直接将EditorFor传递给IEnumerableHtml.EditorFor(m => m.SubmissionTypesSelected); 会为您执行此操作。所以你可以这样做:

local sometable = {
    [1] = [2] = "abc",
}

它将遍历每个项目,为您生成索引,并将单个项目传递给您的编辑器模板。

答案 1 :(得分:0)

如果你这样做会发生什么:

var typesArray = Model.SubmissionTypesSelected.ToArray();
for (int i = 0; i < typesArray.Length; i++)
{
    Html.EditorFor(m => typesArray[i]);
}

答案 2 :(得分:0)

尝试使用CopyTo(Array, Int32),然后继续按照通常使用数组进行迭代。