Вопрос .NET (web) DataGrid with AllowCustomPaging

airman
Уже с Приветом
Posts: 356
Joined: 22 Oct 2000 09:01
Location: Novosibirsk -> Dallas, TX -> Redmond, WA

Post by airman »

Dmitry67 wrote:Еще раз другими словами
Из списка документов уходу в просмотр одного документа
За это время список документов в базе меняется
Нажимаю кнопку возврата в список

Вызываются Page_Init, Page_Load(IsPostBack=0, честно вызывается SQL), Page_PreRender.
В итоге на экране - новый список, все OK !

Дальше у дного элемента ставлю CheckBox. Отрабатывается

Page_Init, Page_Load(IsPostBack=1), Page_PreRender.
И магия ! на экране возник старый список ! Где блин он хранится ?????


Страница со списком делает постбэк? Посмотри, не отключен ли ViewState на ней (аттрибут enabeViewState директивы @Page). Если список оформлен как Web User Control, то скорее всего он использует ViewState.

Хотя мне непонятно, зачем списку делать постбэк на себя (AutoPostBack=true), но это другой вопрос, им может надо так.
airman
Уже с Приветом
Posts: 356
Joined: 22 Oct 2000 09:01
Location: Novosibirsk -> Dallas, TX -> Redmond, WA

Post by airman »

Vitaliy wrote:Посмотрел я этот LosFormatter, честно говоря мое недопонимание стало еще больше. Почему вы его используете, а не связку BinaryWriter/BinaryReader + BinaryFormatter, если уж так охото писать в файлы, вместо более удобной сериализации в сиквел?

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


Как я понимаю, LosFormatter заточен для работы с ViewState, т.к. как дает возможность сохранять и восстанавливать StateBag как base64 encoded string.
Почему они в файл вместо базы пишут, для меня такая же загадка. :)
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

airman wrote:Как я понимаю, LosFormatter заточен для работы с ViewState, т.к. как дает возможность сохранять и восстанавливать StateBag как base64 encoded string.
Почему они в файл вместо базы пишут, для меня такая же загадка. :)


Кстати, возможно я не прав, в таком случае поправьте меня, но LosFormatter работает по тому же принципу что и BinaryFormatter/SoapFormatter, т.е. Shallow Serialization. Соответсвенно, при сериализации, объект будет описан полностью. Поэтому учитывая данный факт, а так же в разы меньший размер разультатирующего буфера, в конечном счете файл будет содержать все то же, только в меньшем количестве байт. :)
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Vitaliy wrote:Посмотрел я этот LosFormatter, честно говоря мое недопонимание стало еще больше. Почему вы его используете, а не связку BinaryWriter/BinaryReader + BinaryFormatter, если уж так охото писать в файлы, вместо более удобной сериализации в сиквел?

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


Я бы тоже хотел узнать ответы на теже вопросы
Короче нарыл кто это сделал (благо хранится в VSS)
Придет этот человек завтра и я буду его иметь :)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Добавьте, "от меня", в профилактических целях. :)
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Пока вот еще что нарыл

Code: Select all

protected DataGrid   DataGridCDC;
private DataView   _dvGrid;
...
DataGridCDC.DataSource = _dvGrid;


Далее про LosFormatter читаем:
Deep serialization is the process of converting the actual values stored in an object's variables into a byte stream. It is the technique used by the BinaryFormatter and SoapFormatter objects, and by .NET Remoting. It is also used in a limited form by the LosFormatter to generate the state data stored in Web Forms pages.


Вот и гадай что именно "limited"
DataGridCDC содержит _dvGrid. Когда восстанавливается из серилизации DataGridCDC, восстанавливается ли _dvGrid ? Чую как то старая копия восстанавливается...
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Dmitry67 wrote:Пока вот еще что нарыл

Code: Select all

protected DataGrid   DataGridCDC;
private DataView   _dvGrid;
...
DataGridCDC.DataSource = _dvGrid;


Далее про LosFormatter читаем:
Deep serialization is the process of converting the actual values stored in an object's variables into a byte stream. It is the technique used by the BinaryFormatter and SoapFormatter objects, and by .NET Remoting. It is also used in a limited form by the LosFormatter to generate the state data stored in Web Forms pages.



Хз, я активно на данный момент использую BinaryFormatter для своего проекта процессинг центра. Все что я вижу у проекта в ВижСтудии А, передается и десериализуется в локальном инстансе ремотинг объекта в ВижСтудии Б.

Dmitry67 wrote:Вот и гадай что именно "limited"
DataGridCDC содержит _dvGrid. Когда восстанавливается из серилизации DataGridCDC, восстанавливается ли _dvGrid ? Чую как то старая копия восстанавливается...


По идее не должен, там же только рефференс на объект сорса, т.е. если объект и есть, но содержит инишиал состояние, то толку от него не будет. Соответственно надо DV перезаполнять или из базы/тейбла/ДСа или из другого инстанса сериализации.
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Эээээ.... прочитал что написал, подумал что не совсем верное читается. Remoting я использую только как транспорт для сериализованных в базу объектов. Такой финт мне нужен в связи с возможностью отложенного исполнения дистрибъютед обекта на сервере. Но самый прикол, что с клиенткой стороны, к этому процессинг либу, через интероп идет обращение от ком объектов. Отсюда все ограничения относительно прямого ремотинга.
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Vitaliy wrote:По идее не должен, там же только рефференс на объект сорса, т.е. если объект и есть, но содержит инишиал состояние, то толку от него не будет. Соответственно надо DV перезаполнять или из базы/тейбла/ДСа или из другого инстанса сериализации.


Мда, закурил сигаретку, и тут дошло, что по рефференсу на датасорс оно сериализует и объект самого датасорса как внутреннюю пременную/has-a объект (например). Мой текст отквоченный выше прошу считать недействительным. :)
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Похоже что да, восстанавливается
А вот с BinaryFormatter не все так просто

Code: Select all

Exception Type: System.Runtime.Serialization.SerializationException
Message: The type System.Web.UI.Triplet in Assembly System.Web, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a is not marked as serializable.
TargetSite: System.Reflection.MemberInfo[]


Может как раз LosFormatter тем и отличается, что как то пропускает объекты, которые не может сериализовать ?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vitaliy
Новичок
Posts: 81
Joined: 04 Oct 1999 09:01
Location: AL.KZ -> CA.US -> NY.US -> MSK.RU

Post by Vitaliy »

Dmitry67 wrote:Похоже что да, восстанавливается
А вот с BinaryFormatter не все так просто

Code: Select all

Exception Type: System.Runtime.Serialization.SerializationException
Message: The type System.Web.UI.Triplet in Assembly System.Web, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a is not marked as serializable.
TargetSite: System.Reflection.MemberInfo[]


Может как раз LosFormatter тем и отличается, что как то пропускает объекты, которые не может сериализовать ?


Для того что бы объект был сериализуемым, достаточно добавить ему атрибут [System.Serializable] и все. :) Но мне как раз вспомнилась фраза с dotnet247 про LosFormatter, что-то типа этот клас реализован не для прямого вызова, а так же я встречал фразу, что это недокументированный класс (что кстати недалеко от истины, ибо инфы по нему очень немного). Т.е. косвенно мы уже имеем предположение, что ViewState просто работает через него, а простому человеку его использование вроде как и не нужно. Я, в общем-то, вполне согласен с вами, что LosFormatter, помимо удобного формата сериализации для символьного вида сохранения, к тому же хоть и менее гибкогий но и более емкогий нежели SoapFormatter. А так же, на основании вышеприведеной ошибки имеет еще то отличие, что может осуществлять сериализацию объектов для этого не заточенных.

Как то длинно получилось, но вроде полно и самодостаточно. :)
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Нашел наконец проблему

Код который делал Load/Save viewstate, делал это в файле

Code: Select all

private string GetFileName()
{
  string x = Session.SessionID.ToString();

  string url = Request.ServerVariables["Path_Info"];
  url = url.Replace("/", "_");

  string fileName = "{0}/{1}_{2}.viewstate";
  fileName = String.Format(fileName, "WebPastViewState", Session.SessionID, url);
  return Server.MapPath(fileName);
}


Вызывалась эта функция два раза: в Load и Save
Я добавил В Save

Code: Select all

string file = GetFileName();
Page.RegisterHiddenField("__VIEWSTATE", file);


В Load

Code: Select all

//string file = GetFileName(); - так было
file = Request.Form["__VIEWSTATE"];


То есть дело очевидно в том что при гулянии по страницам имена генерируемые этой функцией рассогласовываются
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014

Return to “Вопросы и новости IT”