Связывание содержало коллекции из представления Edit Action @model? - PullRequest
0 голосов
/ 24 октября 2011

Может ли кто-нибудь предоставить код, позволяющий использовать [] для сохранения содержимого коллекции в @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 Ответ

0 голосов
/ 24 октября 2011

Проблема в том, что ваша собственность - 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 (того, которое принимает имя шаблона).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...