Как сохранить источник данных сетки после PostBack

Я написал собственный вид сетки и хочу сохранить сетку DataSource в ViewState, но у меня есть это исключение

Введите '‹> f__AnonymousType0`7 [[System.Int32, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a0c561934 ], [System.String, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089], [System.Boolean, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089], [System.String , mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089], [System.Int32, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089], [System.Int32, mscorlib, Version = 2.0 .0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089]] 'в сборке' ExtAspNet.Examples, Версия = 1.0.0.0, Культура = нейтральный, PublicKeyToken = null 'не помечен как сериализуемый.

Теперь я хочу знать, как сохранить сетку DataSource?


person Mehdi Hadjar    schedule 06.11.2011    source источник


Ответы (2)


Все, что вы пытаетесь поместить в состояние просмотра, должно быть украшено атрибутом [Serializable], но, поскольку у вас есть анонимный тип, вы не можете этого сделать.

Но кроме этого, не делайте того, что вы пытаетесь сделать, это значительно увеличит размер вашей страницы и без надобности. Во всяком случае, поместите свой источник данных в Session и повторно привяжите его при обратной передаче, но не помещайте его в viewstate.

Однако обратите внимание, что размещение огромного количества данных в сеансе не масштабируемо, и это тоже не является хорошей практикой, вы должны основывать свое решение в зависимости от размера ваших данных и того, сколько времени требуется, чтобы получить данные из внутреннего хранилища. Вы измерили, насколько дорого обходится получение данных, например, можете ли вы использовать Cache вместо Session?

person Icarus    schedule 06.11.2011
comment
С моим приложением работают до 2500 пользователей, и все мои отчеты использовали этот элемент управления сеткой, поэтому я бы предпочел хранить данные в ViewState, а не в памяти сервера. - person Mehdi Hadjar; 06.11.2011
comment
По еще большей причине: используйте какой-то распределенный кеш, такой как memcached или appfabric, ViewState просто не подходит для этого. - person Icarus; 06.11.2011
comment
@Mehdi Hadjar, я думаю, вы упускаете концепцию ViewState, это замедлит клиентскую сторону, а пропускная способность очень высока, просто умножая ViewState с вашим подсчетом пользователей, чтобы понять, разве это не замедляет ваш сервер? Если у вас ограниченная память, почему бы вам не запрашивать из db каждую обратную передачу или если вы хотите выполнить дамп на стороне клиента, почему вы не сохраняете его в переменной javascript, такой как JSON, и не управляете данными без обратной передачи. - person CallMeLaNN; 28.03.2012

если вы привязываете свой источник данных gridview к таблице данных, вы можете сделать это ...

Объявите datatable следующим образом, и все будет работать, как ожидалось

    private string _theDataTable="theDataTable";
    private DataTable theDataTable
    {
            get
            {
                    if(ViewState[_theDataTable]==null)
                            return new DataTable();
                    return (DataTable)ViewState[_theDataTable];
            }
            set
            {
                    ViewState[_theDataTable] = value;
            }
    }

ваше здоровье!

person Enigma State    schedule 06.11.2011
comment
Спасибо, но у меня не было проблем с DataTable - person Mehdi Hadjar; 06.11.2011