Каков наилучший способ предоставления нескольких объектов представлению в ASP.NET MVC? - PullRequest
4 голосов
/ 25 ноября 2008

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

Ответы [ 7 ]

8 голосов
/ 25 ноября 2008

У вас есть два основных варианта, и любой из них может хорошо работать в зависимости от вашего приложения.

1) Просто поместите объекты в коллекцию ViewData. Это хорошо работает, если у вас много разных контроллеров, которые передают разные данные разным представлениям. Это также зависит от того, сколько вы хотите упаковать / распаковать от объекта, когда вы приводите объекты к их правильным типам. Этот параметр более гибкий, но менее безопасный для типов и, возможно, более хрупкий.

2) Создание строго типизированных объектов, которые содержат другие строго типизированные объекты, полезные для набора представлений. Это хорошо работает, если вы склонны передавать одни и те же данные большинству ваших представлений и у вас меньше контроллеров.

Вы также можете рассмотреть возможность передачи объекта, который предоставляет интерфейс, который может получать различные объекты модели (вроде класса локатора), но это, вероятно, вызывает больше проблем, чем исправляет их.

4 голосов
/ 25 ноября 2008

сделать вложенный класс в вашем контроллере.

public class WhateverControllerViewData
{
   public ObjectA ObjectA {get;set;}
   public ObjectB ObjectB {get;set;}
}

Назначьте их в ваших ActionMethods

{
   var wcvd = new WahteverControllerViewData;
   wcvd.ObjectA = whatever;
   ..

   Return View(wcvd);
}

Затем используйте его в своем представлении

<%= ViewData.Model.ObjectA.Whatever %>

Убедитесь, что вы создали строго типизированное представление с вложенным классом в качестве типа.

3 голосов
/ 25 ноября 2008

Вы можете просто сохранить каждый объект в ViewData, а затем привести соответствующий тип объекта в вашем View.

Контроллер:

 ViewData["ObjectA"] = objectA;
 ViewData["ObjectB"] = objectB;

Вид:

 <%= ((ObjectA)ViewData["ObjectA"]).PropertyA %>
 <%= ((ObjectB)ViewData["ObjectB")).PropertyB %>

или еще лучше,

 <% 
    var objectA = (ObjectA)ViewData["ObjectA"];
    var objectB = (ObjectB)ViewData["ObjectB"];
 %>

 <%= objectA.PropertyA %>
 <%= objectB.PropertyB %>
2 голосов
/ 25 ноября 2008

Я хотел бы, чтобы ваша модель содержала различные типы объектов:

public class TheModel {

  public DataClassA DataTypeA { get; set; }

  public DataClassB DataTypeB { get; set; }

}

Это устраняет объекты приведения и словаря и т. Д.

0 голосов
/ 14 марта 2012

Объект Tuple также может быть использован для этих целей, Tuple typleObject Но строго типизированный контейнерный объект более предпочтителен, поскольку вы можете определить имена свойств

0 голосов
/ 25 ноября 2008

Как насчет использования анонимных типов во ViewData.Model?

0 голосов
/ 25 ноября 2008

Используйте коллекцию ViewData для передачи объекта в представление. Возможно, вы захотите передать контроллер вместо объекта 1 на 1 вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...