Привязка содержала коллекции из действия редактирования @model view?

#asp.net-mvc #asp.net-mvc-3

#asp.net-mvc #asp.net-mvc-3

Вопрос:

Может кто-нибудь, пожалуйста, предоставить код, позволяющий использовать [] для сохранения содержащейся коллекции в @model?

Редактировать представление:

 @model MVC3.Models.A

// I need to save collection values but can't use [] here to setup model binding.
@Html.EditorFor(model => model.Bs[0].Val)  
  

Модели:

 public  class A
{
    public A()
    {
        this.Bs = new HashSet<B>();
    }

    public int Name { get; set; }
    public virtual ICollection<B> Bs { get; set; }
}

public  class B
{
    public int Val { get; set; }
    public virtual A A { get; set; }
}
  

Ответ №1:

Проблема в том, что вашим свойством является an ICollection<T> , которое не предоставляет индексированный доступ к элементам.

Измените его на IList<T> или просто List<T> на, и вы сможете написать свой код представления, как в вашем первом примере.

Если вы по какой-либо причине не можете изменить тип свойства, вам нужно будет создать специализированную модель представления для вашего конкретного представления, а затем сопоставить ее с A моделью в POST action контроллера.

В качестве альтернативы можно (хотя и немного неудобно) напрямую привязываться к простым типам коллекций, если вы соблюдаете надлежащие соглашения 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 framework выяснит, как собрать ее обратно, как только:

 @Html.EditorFor(m => m.Bs);
  

Конечно, это не дает вам никакого контроля над тем, что происходит между шаблонами редактора для каждого элемента, поэтому, если вы пытаетесь сгенерировать <li> для них элементы или что-то в этом роде, вам придется встроить его непосредственно в шаблон редактора, что, возможно, означает создание пользовательского шаблона редактора специально для этой привязки коллекции и использованиесоответствующее переопределение EditorFor (то, которое принимает имя шаблона).

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

Комментарии:

1. Приведение выдает следующую ошибку (из-за hashset для ссылочной целостности / узлов): невозможно неявно преобразовать тип ‘HashSet<B>’ в ‘IList<B>’

2. Можете ли вы предоставить код для специализированной модели представления? Я думаю, что знаю, как настроить, но не уверен, как назначать вещи, сохранять изменения и т. Д.?

3. @Mariah: Похоже, вы используете один и тот же класс для доступа к данным и для своих представлений, что не является хорошей практикой. Модель представления, подходящая для этого приложения, будет выглядеть в основном так же, как модель данных, но с использованием a List<B> вместо ICollection<B> , и, вероятно, без виртуальных членов (которые не слишком полезны в модели, связанной с пользовательским интерфейсом).

4. Привет, Aaronaught, Bs — это просто набор целых чисел.