Сохранение объекта
От: w00drow  
Дата: 18.12.11 15:07
Оценка:
Есть такой код, как видно из него у меня 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"];
        }
    }
Re: Сохранение объекта
От: RushDevion Россия  
Дата: 18.12.11 17:10
Оценка:
Вот так должно получиться (может что и забыл, давно с 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)
        }
    }
Re[2]: Сохранение объекта
От: w00drow  
Дата: 18.12.11 17:33
Оценка:
Здравствуйте, 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>


все по-прежнему
Re[3]: Сохранение объекта
От: RushDevion Россия  
Дата: 18.12.11 17:44
Оценка:
Код бы глянуть
Re[4]: Сохранение объекта
От: w00drow  
Дата: 18.12.11 17:53
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Код бы глянуть


http://dl.dropbox.com/u/7735355/StackLab.rar
Re[5]: Сохранение объекта
От: RushDevion Россия  
Дата: 18.12.11 18:52
Оценка:
Вся фигня в том, что в отличии от 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;
}
Re[6]: Сохранение объекта
От: w00drow  
Дата: 18.12.11 19:14
Оценка:
Здравствуйте, 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>
Re[7]: Сохранение объекта
От: RushDevion Россия  
Дата: 18.12.11 19:35
Оценка:
Вот код. У меня работает. Тесты мог правда поломать — поправишь если что.
http://files.rsdn.ru/76074/StackLab_Modified.zip
Re[8]: Сохранение объекта
От: w00drow  
Дата: 19.12.11 12:22
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Вот код. У меня работает. Тесты мог правда поломать — поправишь если что.

RD>http://files.rsdn.ru/76074/StackLab_Modified.zip

Спасибо огромное!)
Re[9]: Сохранение объекта
От: w00drow  
Дата: 19.12.11 18:22
Оценка:
Теперь новая проблема)
http://dl.dropbox.com/u/7735355/StackLab.rar
В web-форме в методе Page_Load, если закомментить
//OnLogCheckedChanged(fileLogger, fileLog.Checked);
//OnLogCheckedChanged(htmlLogger, htmlLog.Checked);
,
то все работает, а если нет, то Presenter почему-то теряет Stack. Ни имею ни малейшего понятия о причине, ибо с ASP первый раз. Буду рад любой идее)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.