Многоуровневые модели отправляются в единственный экземпляр представления

Моя терминология является, вероятно, путем прочь здесь, но в основном я пытаюсь передать несколько моделей данных представлению. Чтобы помочь поставить вопрос в контексте, возьмите этот пример:

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

Большинство обсуждений, которые я видел, предлагает сильно вводящий страница представления, таким образом, это можно назвать с чем-то как "Представление возврата (RecentComments)" и выполнить итерации через комментарии в представлении, или бросать модель данных как "var NewUsers = (MembershipUserCollection) ViewData. Модель". Что я идеально, после 'право' или по крайней мере 'достаточно право', способ передать многоуровневые модели при тихом поддержании соответствующего логического разделения.

8
задан tshepang 14 February 2014 в 06:17
поделиться

6 ответов

Одним из способов является создание нового типа, который инкапсулирует оба фрагмента данных модели:

public class MyBigViewData {
    public SubData1 SubData1 { get; set; }
    public SubData2 SubData2 { get; set; }
}

public class SubData1 {
    ... more properties here ...
}

public class SubData2 {
    ... more properties here ...
}

Другой способ - хранить "основные" данные модели в виде сильнотипированных данных и хранить другие данные в данных представления в виде элементов словаря:

ViewData["username"] = "joe"; // "other" data
ViewData["something"] = "whatever"; // "other" data
ViewData["subdata1"] = new SubData1(...);
return View(myRealModelData);

Преимущество второго подхода заключается в том, что вам вообще не нужно делать ничего особенного: он работает прямо из коробки:

.
14
ответ дан 3 November 2019 в 13:09
поделиться

То, что я сделал в прошлом, это написал класс, который содержал экземпляры обоих классов, которые мне понадобятся на вид.

т.е.

public class City{
public Mall TheMall;
public School TheSchool;
}

Тогда ваш вид будет сильно напечатан как City, и вы будете использовать Model.TheMall.Property и Model.TheSchool.Property для доступа к тому, что вам нужно

EDIT

Это пример того, что означают другие плакаты, создавая объект с обоими объектами в виде полей/свойств

.
8
ответ дан 3 November 2019 в 13:09
поделиться

Способом передачи нескольких моделей для просмотра является создание того, что мы называем Form View Model (Модель просмотра формы), в которой есть другие ваши модели.

Затем вы можете передать отдельные модели, содержащиеся в вашем представлении формы, в частичные представления, отвечающие за отрисовку данных в указанных моделях.

Имеет смысл?

редактировать

btw: модель представления формы - это просто класс. это не специальный тип, как могло быть предложено в моем ответе.

.
3
ответ дан 3 November 2019 в 13:09
поделиться
[

] После работы над большим приложением ASP.NET MVC я обнаружил, что наиболее продуктивным при минимизации времени выполнения отливок был подход, основанный на использовании дженериков для имитации вложенной структуры представлений. По сути представления получают свой собственный тип данных. Обычно это либо объекты домена, либо коллекции объектов домена, которые включают в себя метаданные. Общие версии этих типов доступны на всех возможных главных страницах, принимая параметр типа, который определяет данные, имеющие отношение к главной странице.[

] [
public class Car {
  // can be used as a model
} 

public class CarCollection: Collection<Car> {
  public BodyTypes BodyType {get;set;}
  public Colors Color {get;set;}
  // can also be used as a model
}

public interface ILayoutModel<TLayout> {
  TLayout LayoutModel {get;set;}
}

public class CarView<TLayout>: Car, ILayoutModel<TLayout>  {
  // model that can be used with strongly-typed master page
}

public class CarCollection<TLayout> : CarCollection, ILayoutModel<TLayout> {
  // model that can be used with strongly-typed master page
}

public class LayoutAData {
  // model for LayoutA.master
}

public class LayoutBData {
  // model for LayoutB.master
}
] [

]Можно также инвертировать общие черты, но поскольку представление диктует компоновку, данные представления должны доминировать над данными компоновки, по моему мнению. LayoutA.master будет выводиться из []ViewMasterPage>[], а LayoutB.master будет выводиться из []ViewMasterPage>[]. Это делает данные вида и данные макета раздельными, последовательными, сильно типизированными и гибкими.[

].
1
ответ дан 3 November 2019 в 13:09
поделиться
[

] В дополнение к моему другому ответу, другим способом сделать это было бы не сильно набирать вид и основные страницы в директиве page, а вместо этого использовать общие расширения ViewData на основе типов из []MVC Contrib[]. Эти расширения в основном используют полное имя типа в качестве ключа словаря ViewData. По сути, преимущества набора текста такие же, как и в случае с сильно напечатанными страницами, с меньшими накладными расходами классов с точки зрения количества требуемых классов модели представления. Затем в своих действиях вы делаете[

] [
ViewData.Add<Car>(car);
ViewData.Add<LayoutAData>(layoutAData);
] [

]и в представлениях, которые вы делаете[

] [
<%= ViewData.Get<Car>().Color %>
] [

]и на главной странице вы делаете[

] [
<%= ViewData.Get<LayoutAData>().Username %>
] [

]Вы можете кэшировать эти вызовы Get<> в представлениях, чтобы снизить стоимость многократного броска[

].
2
ответ дан 3 November 2019 в 13:09
поделиться

К сожалению, единственный способ выполнить передачу нескольких объектов - это либо создать объект с обоими объектами в виде полей/свойств, либо использовать слабо типизированный массив.

3
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: