[ASP.NET MVC] Как правильно передавать инфу между вьюхами?

356ft85

Вопрос по ASP.NET MVC - Как правильно передавать инфу между вьюхами?
Допустим есть какая нибудь партиальная вьюха, в SiteMaster'e вызывается через RenderPartial ("ВЬЮХА_1");
Допустим есть какая нибудь партиальная вьюха №2 , которая вызывается в основной (той, которую контроллер возварщает как Return View; ) вьюхе через RenderPartial ("ВЬЮХА_2");
если в 1ой вьюхе напишу int x=5; как потом это значение получить во второй вьюхе , чтоб сделать с ним тчо нибудь, напрмиер Reponse.Write(x); ?

zorin29

1 - передать ей x в качестве ее модели:

RenderPartial("View_2", x)

2 - засунуть значение во ViewBag
P.S. Вообще говоря, ты не должен этого хотеть :)
Твой контроллер, по идее, должен необходимую инфу сложить в модель, и вьюхи - эту модель отобразить.

356ft85

Твой контроллер, по идее, должен необходимую инфу сложить в модель, и вьюхи - эту модель отобразить.
Так и есть, НО это верно для вьюх которые вызываются иерархически из той вьюхи которую возвращает контроллер
Return View;
Но есть ещё такая вьюха как Site.Master из которой тоже фигова туча вьюх вызывается - вот как из контроллера данные в них передать?

6yrop

я детали уже не помню, но первый предложенный вариант, имхо, самый правильный. Это же не просто модель, а ViewModel, т.е. специальная хрень, которая обслуживает View.

356ft85

я детали уже не помню, но первый предложенный вариант, имхо, самый правильный. Это же не просто модель, а ViewModel, т.е. специальная хрень, которая обслуживает View.
Не очень понятно только, как она поможет мне данные из контроллера передать в Site.MAster..
начинается он вот такими вот словами:
<%@ Master Language='C#' Inherits='System.Web.Mvc.ViewMasterPage' %>

6yrop

я не очень понял детали твоей ситуации, а разбираться не охота, могу сказать следующее. Обмениваться с мастер пейджем параметрами без использования кастов, имхо, нельзя в идеологии MVC (это явный косяк идеологии asp.net mvc). Если с кастами, то с мастера до модели пейджи можно дотянуться как-то так “ViewPage)Page).Model”. Погугли, я в свое время вроде гуглил, народ предлагал какие-то решения.
P.S. Сценарий “мастер пейдж” фактически колбек с колбеками, и через лямбды это реализуется естественным образом (без кастов). Но почему-то в Razor-е лямбды нормально не поддержали. Читал, что чувак из Mono по этой причине написал свою view engine :grin: .

356ft85

я не очень понял детали твоей ситуации, а разбираться не охота, могу сказать следующее.
А что именно не понятно, кстати?
Есть данные которые надо передать из контроллера в мастер пейдж.
Щас делаю так - в контроллере Session['key']=value;
В мастерпейдже юзаю Session['key']
Думал, может есть что по лучше для этого =)

zorin29

ну, как минимум, лучше ViewBag.

6yrop

Session['key']
тогда уж лучше ViewData["key"]
updated: или лучше ViewBag из MVC 3

olegusmaximus

ну без кастов если, то никто не мешает стронглитайп сделать модель мастера и там хранить необходимые для мастера данные
<%@ Master Language='C#' Inherits='System.Web.Mvc.ViewMasterPage<MasterModel>' %>
а для вьюх мастера модели ViewModel1 наследовать от MasterModel
или я посыл про касты неверно понял?

zorin29

ИМХО, использовать наследование для композиции нехорошо. Хотя да, общий родитель для все ViewModel-ов - это частое решение.
Мне такое не требовалось, но если бы стало нужно, то я, наверно, определил бы интерфейс IViewModel с нужными пропертями, и все model-ы заставил бы этот интерфейс реализовывать.
Ну или можно как вот тут: http://blog.gauffin.org/2011/09/getting-information-into-the...

6yrop

ну без кастов если, то никто не мешает стронглитайп сделать модель мастера и там хранить необходимые для мастера данные
<%@ Master Language='C#' Inherits='System.Web.Mvc.ViewMasterPage<MasterModel>' %>
да, сказав "нельзя" я был не прав. Если через наследование от класса или интерфейса это работает, то классно :)! Я, видимо, с чем-то перепутал, давно это было :), но что-то мне не нравилось мастер пейджами.
Оставить комментарий
Имя или ник:
Комментарий: