ahmed_sa Ответов: 2

Невозможно применить индекс с помощью [ ] к выражению типа icollection MVC view ASP.NET ядро 2.1


проблема
невозможно применить индекс с помощью [ ] к выражению типа Icollection mvc view asp.net ядро 2.1
public class SalesHeader
    {
        public SalesHeader()
        {

        }
        public int SalesYear { get; set; }
        public int BranchCode { get; set; }
        public ICollection<SalesFooter> SalesFooters { get; set; }
    }


Что я уже пробовал:

@for (var i = 0; i < Model.SalesFooters.Count; ++i)
                   {
                       <tr>
                           <td>
                               @Html.EditorFor(f => f.SalesFooters[i].ItemCode)
                           </td>
                           <td>
                               @Html.EditorFor(f => f.SalesFooters[i].Quantity)
                           </td>
                           <td>
                               @Html.EditorFor(f => f.SalesFooters[i].UnitPrice)
                           </td>
                       </tr>
                   }


она в петлю выше ошибка компиляции
cannot apply index with [ ] to an expression of type Icollection mvc view asp.net core 2.1

Как решить эту ошибку, пожалуйста ?

2 Ответов

Рейтинг:
1

Dave Kreskowiak

Интерфейс ICollection не имеет определенного индексатора []. Вы не можете использовать его как массив.

Однако он поддерживает перечисление. В вашем случае вы можете просто заменить цикл for на foreach и использовать вместо него перечислитель:

@foreach (var footer in Model.SalesFooters)
{
    <tr>
        <td>
            @Html.EditorFor(f => footer.ItemCode)
        </td>
        <td>
            @Html.EditorFor(f => footer.Quantity)
        </td>
        <td>
            @Html.EditorFor(f => footer.UnitPrice)
        </td>
    </tr>
}


F-ES Sitecore

Однако привязка модели не работает с этой техникой, вам нужно использовать индексаторы массивов, и именно здесь, как я полагаю, возникает первоначальная проблема.

Dave Kreskowiak

Немного странно, что он прекрасно работает для меня, хотя я использую полный фреймворк, а не ядро.

Рейтинг:
0

OriginalGriff

ICollection - это базовый интерфейс для всех классов коллекций в .NET: Интерфейс ICollection (System.Коллекции) | Майкрософт Документы[^]
А это значит, что Илист-это полученный из моей коллекции, а не наоборот. IList поддерживает индексацию, а ICollection-нет.

Объект, реализующий IList, может быть сохранен в переменной ICollection, но вы не можете использовать для него методы IList (или индексаторы) без приведения его к IList (что может привести к сбою, поскольку не каждый объект ICollection является IList).