модель c # mvc против viewbag - PullRequest
11 голосов
/ 08 июля 2011

Предположим, у вас есть список людей 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);

И у тебя есть идея. Это правильный способ выполнить мою задачу или есть лучший способ сделать то, что я хочу на C #?

Ответы [ 5 ]

17 голосов
/ 08 июля 2011

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

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

8 голосов
/ 08 июля 2011

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

2 голосов
/ 08 июля 2011

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

2 голосов
/ 08 июля 2011

Ваш первый и третий варианты кажутся в порядке.

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

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

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

2 голосов
/ 08 июля 2011

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

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