Модель привязки данных обратной передачи к параметру действия контроллера типа List<T>

StackOverflow https://stackoverflow.com/questions/2400391

Вопрос

У меня есть строгий типологический взгляд на тип

List<List<MyViewModelClass>>

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

Мой класс view model выглядит примерно так:

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; }
}

А также изменил мою первую версию controller action на:

public ActionResult ConsumeSelections(Options data)
{
    // process data
}
Это было полезно?

Решение 2

Решение

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

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, и не имеют никаких пробелов.И у вас будет хорошее работающее приложение с динамическим количеством элементов в коллекции.

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

Другие советы

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

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();
}

Редактировать:Взгляните на этот пост, так как это именно то, чего вы хотите!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top