#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 — это просто набор целых чисел.