Модель привязывает данные обратной передачи к параметру действия контроллера типа List <T> - PullRequest
2 голосов
/ 08 марта 2010

У меня строгое представление типа

List<List<MyViewModelClass>>

Внешний список всегда будет иметь два списка List<MyViewModelClass>. Для каждого из двух внешних списков я хочу отобразить группу флажков. Каждый набор может иметь произвольное количество вариантов выбора.

Класс модели моего вида выглядит примерно так:

public class MyViewModelClass
{
    public Area Area { get; set; }

    public bool IsGeneric { get; set; }

    public string Code { get; set; }

    public bool IsChecked { get; set; }
}

Таким образом, окончательный вид будет выглядеть примерно так:


Пожалуйста, выберите подходящие варианты:

Первый набор вариантов:

  • x Вариант 1
  • x Вариант 2
  • x Вариант 3
  • и т.д.

Второй набор вариантов:

  • x Второй вариант 1
  • x Второй вариант 2
  • x Второй вариант 3
  • x Второй вариант 4
  • и т.д.

Флажки должны отображать MyViewModelClass.Area.Name, а их значение должно быть связано с MyViewModelClass.Area.Id. Проверенное состояние, конечно, связано с MyViewModel.IsChecked.

Вопрос

Интересно, как мне использовать помощник Html.CheckBox() или Html.CheckBoxFor() для отображения моих флажков? Я должен вернуть эти значения обратно на сервер при обратной передаче.

Мне бы хотелось, чтобы действие моего контроллера было одним из следующих:

public ActionResult ConsumeSelections(List<List<MyViewModelClass>> data)
{
    // process data
}

public ActionResult ConsumeSelections(List<MyViewModelClass> first, List<MyViewModelClass> second)
{
    // process data
}

Если все будет проще, я мог бы создать отдельный тип модели вида, например:

public class Options
{
    public List<MyViewModelClass> First { get; set; }

    public List<MyViewModelClass> Second { get; set; }
}

А также изменив мою первую версию действия контроллера на:

public ActionResult ConsumeSelections(Options data)
{
    // process data
}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2010

Решение

Оказывается, это совсем не так сложно. Все, что вам нужно сделать, это правильно назвать свои элементы управления, и все будет связано вместе, как и должно быть. Так. Какими бы ни были ваши элементы управления, они всегда должны называться как:

name="first[0].propName"
name="first[1].propName"
name="first[2].propName"
name="first[3].propName"
...

// or
name="first[0].data[0].property"
name="first[0].data[1].property"
name="first[0].data[2].property"
...
name="first[1].data[0].property"
name="first[1].data[1].property"
...

Все они будут связаны с List<SomeType> first параметром действия контроллера (второй имеет другую коллекцию внутри коллекции).

Очень важное примечание
Если вы добавляете / удаляете эти элементы управления динамически, используя Javascript, вы должны убедиться, что индексы являются последовательными, начиная с 0, и не имеют пробелов. И у вас будет хорошее рабочее приложение с динамическим количеством элементов в коллекции.

Вы можете прочитать об этом в моем блоге .

0 голосов
/ 08 марта 2010

Обычно я создаю тип (Модель), который "моделирует" представление, которое я хочу создать.т.е.

public class FooViewModel
{
    public List<Option> General { get; set; }
    public List<Option> Others { get; set; }

    //Some Methods and other properties
}
public FooController :...
{
    private FooViewModel fooViewModel = new FooViewModel();
}

Редактировать: Посмотрите на этот пост , так как это именно то, что вы хотите!

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