Модель С# mvc vs viewbag

Предположим, у вас есть список людей A и список людей B на странице. И эти два являются отдельными классами в L2S, представляющими две разные таблицы. Поэтому вы не можете передать одну модель следующим образом:

...
@model PeopleA
...
@foreach(var peopleA in Model.People) ...

@foreach(var peopleB in //what?)

Соответственно, я думаю, у меня есть три варианта.

  • Первым делом является разделение страницы на частичные представления, чтобы я мог передать модель с помощью RenderAction помощника. Поскольку я буду использовать эти частичные представления только после того, как этот параметр не будет привлекать меня.
  • Второй вариант - использовать ViewBags, которого я не хочу, поскольку предпочитаю сильно типизированные модели.
  • Последнее, наконец, которое я собирался использовать, но хотел спросить, прежде чем делать это, заключается в создании модели следующим образом:

ModelMyPage.cs

public List<PeopleA> peopleA { get; set; }
public List<PeopleB> peopleB { get; set; }

MyController.cs

... 
ModelMyPage m = new ModelMyPage();
m.peopleA = // query
m.peopleB = // another query
return(m);

И у тебя есть идея. Является ли это действительным способом выполнения моей задачи или есть лучший способ С# делать то, что я хочу?

Ответ 1

Создание ViewModel, специфичного для страницы, так как ваш вариант 3 - это то, как я это сделал.

Я считаю, что это также рекомендуемый подход.

Ответ 2

Нет, нет лучшей идеи. В asp.net MVC M означает ViewModels, а не модели Business, Domain. Рекомендуется создавать ViewModels для ваших просмотров, и это не рекомендуется использовать бизнес-модели. Вы должны спроектировать свои ViewModels, чтобы они соответствовали потребностям взаимодействия с контроллером с Domain, а также от контроллера для просмотра взаимодействий.

Ответ 3

Я сделал бы это третий путь. Кроме того, если вы собираетесь отображать одинаковый html для каждого человека в обоих массивах, я бы конкатенировал их перед foreach:

var person in Model.PeopleA.Concat(Model.PeopleB)

Ответ 4

Ваш первый и третий варианты выглядят как ОК.

ad 1) "только с их использованием один раз" не является хорошим аргументом. Используйте частичные представления для организации представлений.

ad 2) Используйте Viewbag для добавления небольших элементов, таких как список поиска.

ad 3) ViewModels являются (становятся) обычными в MVC. Вероятно, это лучший подход.

Ответ 5

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