.Net MVC передача вложенных данных из контроллера для просмотра
-
23-08-2019 - |
Вопрос
Я создаю приложение .NET MVC и у меня есть представление, в котором я хочу отобразить следующее:
Категория
за которым следует список предметы для текущей категории
[возможно] за которым следует список подпункты для текущего элемента
Я мог бы создать собственный класс ViewModel, который отправляет три отдельных списка IEnumerable (категории, элементы и подэлементы).Проблема с этим подходом заключается в том, что нет простого способа отобразить данные в правильном порядке (иерархии) в представлении.При таком подходе у меня будет три списка, а затем во время рендеринга нужно будет добавить условную логику.Это будет означать, что каждый список элементов будет повторяться несколько раз, пока я пытаюсь разместить элементы в нужных позициях на странице.
Я бы предпочел передать данные в правильном порядке, например, в виде XML-файла.Какой здесь правильный подход?
Я также рассматривал возможность объединения данных в контроллере и передачи форматированного текста в представление, но это, похоже, нарушает идею рендеринга дескриптора представления.
Решение
Здесь я бы держался подальше от XML.Передайте правильную иерархию;это кажется разумным:
public class ViewModel
{
Category[] Categories { get; set; }
}
public class Category
{
Item[] Items { get; set; }
}
public class Item
{
Item[] SubItems { get; set; }
}
тогда вы можете вложить foreach
циклы внутри вашего представления.
Другие советы
Вероятно, вам следует иметь Пользовательский тип со списком категорий, и каждый элемент имеет свойство, в котором содержатся подэлементы.
Этого можно легко добиться в Entity Framework, используя Свойства навигации.
Я бы установил класс модели категории со свойством элементов типа IEnumerable<item>
.
Затем включите IEnumerable<subItem> subItems
недвижимость на item
сорт.
Представление будет очень легко перебирать эти элементы и подэлементы.
Редактировать: на самом деле, если подэлементы точно такие же, как и элементы, то может быть только один item
класс с IEnumerable<item> subItems
свойство.Это также позволит использовать неограниченное количество подпунктов.