Модель привязки данных обратной передачи к параметру действия контроллера типа List<T>
-
18-09-2019 - |
Вопрос
У меня есть строгий типологический взгляд на тип
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();
}
Редактировать:Взгляните на этот пост, так как это именно то, чего вы хотите!