MVC - Как получить 2 сущности из контроллера и заполнить их на странице?

Fantastick

Например:О нас НовостиТрампарам | 01.04.2010 Мы такие все хорошие | Шутка дня ...Контроллер на эту страницу вот так отрабатывает:
public ActionResult Index()
 {
 ViewBag.Message = "Фотостудия Eve приветствует Вас!";

 return View(db.News.ToList());
 }
В модели идет обработка:
@foreach (var item in Model)
 { 
 <tr>
 <td>
 @Html.DisplayFor(modelItem => item.newsDate)
 </td>
 <td>
 @Html.DisplayFor(modelItem => item.newsContent)
 </td>
 </tr>
 }
Но тут я получаю только новости, а как мне еще другой контент передать.Заранее спасибо всем откликнувшимся, ногами не бить первый день asp|net
23 ответа

Fantastick

Fantastick,Простейший способ - сделать ViewModel, заполнить всеми нужными данными, и передавать во вьюху ее, а не сущности


Fantastick

ViewBag.OtherData = "другие данные:)), хоть класс, хоть структуру";
ДопустИм вариант создания отдельной ViewModel для данной вьюхи и передавать ее.


Fantastick

SanSYS,ViewBag в топку, only model!


Fantastick

Deza,А как через model?


Fantastick

Deza,И почему в топку?


Fantastick

Deza,А как через model?
смотретьhttp://www.techdays.ru/videos/ASP.NETначать с Тренинг ASP.NET MVC 3 - Модуль 1. Знакомство с MVC 3и до Тренинг ASP.NET MVC 3 - Модуль 7. Внедрение зависимостейну и остальные тоже интересные


Fantastick

Deza,За ссылки огромное спасибо, но вот в данной ситуации как делать? есть ли простое решение или гиперболойд инженера Гарина реализовывать?


Fantastick

SanSYS,ViewBag в топку, only model!
Аргументируйте, пожалуйстаViewBag для передачи какой-то мелкой доп. инфы считаю приемлемым методом (только не в отношении структур, вы же понимаете особенности работы clr с dynamic?)Для остального, конечно же - ViewModelhttp://msdn.microsoft.com/ru-ru/magazine/gg650669.aspx


Fantastick

Посмотрел я уроки, спасибо огромное.Но то ли я плохо смотрел, то ли не освещена эта тема, но кроме как вариантов:1. через ViewBag передать 2ую сущность2. передать весь контекст в представлениеХорошо ли так делать или как это можно сделать по другому?


Fantastick

Аргументируйте, пожалуйстаViewBag для передачи какой-то мелкой доп. инфы считаю приемлемым методом (только не в отношении структур, вы же понимаете особенности работы clr с dynamic?)Для остального, конечно же - ViewModelhttp://msdn.microsoft.com/ru-ru/magazine/gg650669.aspx
SanSYS, он прав. ViewBag в топку. Только модель.
class MyClass
{
 public A PropertyA { get; set; }
 public B PropertyB { get; set; }
}


Fantastick

МСУ, ок, а в случае если вывести данные необходимо где-то вне возвращаемой вьюшки? (ajax не обсуждаем)к примеру в лейауте? - мс в своем стандартном шаблоне использует для вывода заголовка примерно такое: ViewBag.Title, да и Фриман с Сандерсеном не брезгуютА учитывая, что ViewBag это по сути тупо свойство с отсылкой/оберткой над ViewData, то оно добавляет только удобства в использовании
public dynamic ViewBag {
 get {
 if (_dynamicViewData == null) {
 _dynamicViewData = new DynamicViewDataDictionary(() => ViewData);
 }
 return _dynamicViewData;
 }
 }
Сегодня я начал собирать один новенький проект, пока создано лишь 11 вьюх, ViewBag использован только для передачи Title, вряд ли заюзаю его еще для чего нить, по вполне понятным причинамНе подумай что я утверждаю что использовать ViewBag везде и всегда можно, но есть случаи когда вполне приемлемо, главное не переусердствовать, а то потом руки отрывать тем кто использовал viewbag налево и направо Кстати - при биндинге эдиторов, вроде наличие данных для биндинга сначала проверяются во ViewBag, после во ViewData, а потом уже в пропертях модели (но это при использовании синтаксиса типа Html.DropDownList("DataKey"), кажется)Но это я точно не знаю, т.к. с фреймворком MVC почти незнаком


Fantastick

SanSYS, ViewBag.Title и Model, разве не чувствуете разницы? :)


Fantastick

Fantastick,что то типа такого
public ActionResult Details(int? id, string topics, string sec)
 {
 var searchModel = new SearchModel
 {
 ColsPerPageM = colsPerPage,
 QueryType = queryType,
 ResultModels =
 SearchResultHelper.GreateSearchResult(queryType, colsPerPage,
 currentPage*itemsPerPage, itemsPerPage,
 res, votePermissions, currentPage),
 Pages =
 PagerHelper.CreatePageSearch(itemsPerPage,
 Convert.ToInt32(res.GetMaxAvailableItemsCount()),
 this.Url, p == null ? 0 : p.Value, query,
 queryType),
 
 Query = q,
 Navigation = new NavigationModel
 {
 Menu =
 MainMenuhelper.CreateSearchMenu(q, queryType, currentPage,
 this.Url),
 IsAjax = true
 },
 IsPost = false
 };
 ViewData.Model = searchModel ;
 return this.View();
 }


Fantastick

Fantastick,что то типа такого
ViewData.Model = searchModel ;
 return this.View();
 }
// ViewData.Model = searchModel; это на кой?
 return View(searchModel);
 }


Fantastick

МСУ, ок, а в случае если вывести данные необходимо где-то вне возвращаемой вьюшки? (ajax не обсуждаем)
Без разницы. Используем всегда модель.
Но это я точно не знаю, т.к. с фреймворком MVC почти незнаком
А почему тогда советы даете? :)


Fantastick

Без разницы. Используем всегда модель
Ну.. Не совсем без разницы, вот смотри:1. есть _layout2. есть типизированная вьюха, использует _layout для рендера3. передаем модель { Object SomeData, String Title }4. Каким образом использовать в _layout Model.Title?Варианты:1. @section - хороший вариант при условиях: наличия секции, вьюха непосредственно юзает _layout2. @ViewData.Model.Title - ViewData.Model то ли Object, то ли dynamic, нужны лишние проверки3. при использовании ajax - понятно, все просто, но нужно писать клиентский лишний код хотя бы раз4. ViewBag.Title - относительно неплохой вариант, учитывая что при отсутствии свойства нет даже эксепшенов при необработанном выводе (хотя в этом есть большая проблема, посему и не использую, + мне чаще удобнее юзать модели)
А почему тогда советы даете? :)
Потому что полагаю, что я могу дать советы на простые вопросы, потому и даюДа и к тому же - не мало интересного можно узнать :)


Fantastick

ViewBag, ViewData следует использовать для вывода дополнительной (служебной) информации: заголовок страницы, сообщения, индекс текущей страницы в пейджинге. Для того, что нужно ТСу - ViewModel.


Fantastick

4. Каким образом использовать в _layout Model.Title?
Как вариант, можно сделать MasterViewModel, и наследовать от нее остальные. // PageViewModel : MasterViewMode


Fantastick

SanSYS, я уже тыщу раз писал о модели представления. Собственно, это и есть бест-практис для MVC - отдаем модель представления, которая в себя включает как и модель, так и вспомогательные классы для формирования представления.


Fantastick

.. так и вспомогательные классы для формирования представления.
А "вспомогательные классы для формирования представления" это что? Контролы что-ли? :]


Fantastick

// ViewData.Model = searchModel; это на кой?
 return View(searchModel);
 }
Привычка:)


Fantastick

SanSYS, я уже тыщу раз писал о модели представления. Собственно, это и есть бест-практис для MVC - отдаем модель представления, которая в себя включает как и модель, так и вспомогательные классы для формирования представления.
Это бест-практис, однозначно ты прав, как бы в этом отношении даже не собираюсь дискуссировать )


Fantastick

Это бест-практис, однозначно ты прав, как бы в этом отношении даже не собираюсь дискуссировать )
Тогда спич можно закрывать :)