Есть такой код, как видно из него у меня MVP) Так вот, при срабатывании какого-то события, естественно страничка перезагружается и мой презентер улетает в ничто, я попытался его сохранить, но не работает) Подскажите, что не так или как реализовать работающую версию)
PS: очень далек от ASP)
public partial class View : System.Web.UI.Page, IView, ILog
{
private Presenter presenter;
public View ()
{
presenter = new Presenter(this);
}
public event Action OnCreate;
public event Action OnPop;
public event Action OnPush;
public string Log
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
protected void CreateClick(object sender, EventArgs e)
{
Session["Presenter"] = presenter;
OnCreate();
}
protected void PushClick(object sender, EventArgs e)
{
Session["Presenter"] = presenter;
OnPush();
}
protected void PopClick(object sender, EventArgs e)
{
Session["Presenter"] = presenter;
OnPop();
}
protected void Page_Load(object sender, EventArgs e)
{
presenter = (Presenter)Session["Presenter"];
}
}
Вот так должно получиться (может что и забыл, давно с ASP.NET не работал):
protected override void PageLoad() {
presenter = new Presenter(this);
if (!IsPostBack)
{
//TODO: Init presenter for first page call
}
else
{
//TODO: init presenter from post back data (second and following calls)
}
}
Здравствуйте, RushDevion, Вы писали:
RD>Вот так должно получиться (может что и забыл, давно с ASP.NET не работал):
RD>RD>protected override void PageLoad() {
RD> presenter = new Presenter(this);
RD> if (!IsPostBack)
RD> {
RD> //TODO: Init presenter for first page call
RD> }
RD> else
RD> {
RD> //TODO: init presenter from post back data (second and following calls)
RD> }
RD> }
RD>
все по-прежнему
Здравствуйте, RushDevion, Вы писали:
RD>Код бы глянуть
http://dl.dropbox.com/u/7735355/StackLab.rar
Вся фигня в том, что в отличии от WinForms, где View живет бесконечно долго, в Web оно живет только пока обрабатывается запрос,
поэтому, View для Presentera нужно каждый раз выставлять заново. По хорошему конечно хранить презентер в сессии — это сранно, нужно
выделить сервис хранения данных (стэка в твоем случае), который будет брать данные из сессии и в OnLoad создавать презентер заново,
и инициировать его этим сервисом.
Короче, во viewшке убираем весь код работы с сессией и добавляем вот это:
protected override void OnLoad( EventArgs e )
{
if ( Presenter == null )
{
Presenter = new Presenter();
}
Presenter.SetView( this );
base.OnLoad( e );
}
protected Presenter Presenter
{
get { return Session[typeof( Presenter ).FullName] as Presenter; }
set { Session[typeof( Presenter ).FullName] = value; }
}
В презентере — убрать конструктор принимающий View, и добавить вот это
public void SetView( IView view )
{
if ( this.view != null )
{
//Этот код тут потому что я параноик и не доверяю GC :), если бы мы не хранили презентер в сессии, то кода бы тут не было.
this.view.OnCreate -= CreateStack;
this.view.OnPush -= Push;
this.view.OnPop -= Pop;
}
this.view = view;
view.OnCreate += CreateStack;
view.OnPush += Push;
view.OnPop += Pop;
}
Здравствуйте, RushDevion, Вы писали:
RD>Вся фигня в том, что в отличии от WinForms, где View живет бесконечно долго, в Web оно живет только пока обрабатывается запрос,
RD>поэтому, View для Presentera нужно каждый раз выставлять заново. По хорошему конечно хранить презентер в сессии — это сранно, нужно
RD>выделить сервис хранения данных (стэка в твоем случае), который будет брать данные из сессии и в OnLoad создавать презентер заново,
RD>и инициировать его этим сервисом.
RD>Короче, во viewшке убираем весь код работы с сессией и добавляем вот это:
RD>RD>protected override void OnLoad( EventArgs e )
RD>{
RD> if ( Presenter == null )
RD> {
RD> Presenter = new Presenter();
RD> }
RD> Presenter.SetView( this );
RD> base.OnLoad( e );
RD>}
RD>protected Presenter Presenter
RD>{
RD> get { return Session[typeof( Presenter ).FullName] as Presenter; }
RD> set { Session[typeof( Presenter ).FullName] = value; }
RD>}
RD>
падает на кликах с нул рефференс эксепшен
RD>В презентере — убрать конструктор принимающий View, и добавить вот это
RD>RD>public void SetView( IView view )
RD>{
RD> if ( this.view != null )
RD> {
RD> //Этот код тут потому что я параноик и не доверяю GC :), если бы мы не хранили презентер в сессии, то кода бы тут не было.
RD> this.view.OnCreate -= CreateStack;
RD> this.view.OnPush -= Push;
RD> this.view.OnPop -= Pop;
RD> }
RD> this.view = view;
RD> view.OnCreate += CreateStack;
RD> view.OnPush += Push;
RD> view.OnPop += Pop;
RD>}
RD>
Вот код. У меня работает. Тесты мог правда поломать — поправишь если что.
http://files.rsdn.ru/76074/StackLab_Modified.zip
Здравствуйте, RushDevion, Вы писали:
RD>Вот код. У меня работает. Тесты мог правда поломать — поправишь если что.
RD>http://files.rsdn.ru/76074/StackLab_Modified.zip
Спасибо огромное!)
Теперь новая проблема)
http://dl.dropbox.com/u/7735355/StackLab.rar
В web-форме в методе Page_Load, если закомментить
//OnLogCheckedChanged(fileLogger, fileLog.Checked);
//OnLogCheckedChanged(htmlLogger, htmlLog.Checked);
,
то все работает, а если нет, то Presenter почему-то теряет Stack. Ни имею ни малейшего понятия о причине, ибо с ASP первый раз. Буду рад любой идее)