Проблема в том, что ваша собственность - ICollection<T>
, которая не обеспечивает индексированный доступ к элементам.
Измените его на IList<T>
или просто List<T>
, и вы сможете написать свой код представления, как в первом примере.
Если по какой-то причине вы не можете изменить тип свойства, вам необходимо создать специальную модель представления для вашего конкретного вида и затем сопоставить ее с моделью A
в действии контроллера POST.
Кроме того, можно (хотя и немного неудобно) напрямую связывать с простыми типами коллекций, если вы соблюдаете правильные соглашения HTML, что означает использование нескольких input
элементы с тем же именем , как описано Филом Хааком , то есть:
<input type="text" name="ints" value="1" />
<input type="text" name="ints" value="4" />
<input type="text" name="ints" value="2" />
<input type="text" name="ints" value="8" />
Но это работает только для простых типов, т. Е. Примитивов или строк, а не сложных типов, таких как B
в этом контексте.
Один последний комментарий: если вы используете шаблоны редактора, вы можете просто связать всю коллекцию, и инфраструктура MVC выяснит, как ее собрать, как показано ниже:
@Html.EditorFor(m => m.Bs);
Конечно, это не дает вам контроля над тем, что идет между шаблонами редактора для каждого элемента, поэтому, если вы пытаетесь сгенерировать для них <li>
элементов или что-то в этом роде, вы необходимо встроить его непосредственно в шаблон редактора, что, возможно, означает создание специального шаблона редактора специально для этой привязки коллекции и использования соответствующего переопределения EditorFor
(того, которое принимает имя шаблона).
Это немного болезненно, но может оказаться меньше работы, чем пытаться переключиться на систему с параллельными моделями, если вы до сих пор делили классы между вашим пользовательским интерфейсом и слоями данных.