ViewState потерян при обновлении в UpdatePanel? - PullRequest
3 голосов
/ 16 декабря 2009

Вместо того, чтобы использовать объект Session или сохранять в базе данных, я храню временные переменные, которые мне нужно сохранить в пользовательских переменных ViewState. Например, ViewState ("MyField1") = 1

Когда пользователь нажимает кнопку Rrefresh в браузере, Page.IsPostback возвращается к False, а ViewState исчезает.

Мой вопрос Если пользователь может сдуть Viewstate путем обновления, зачем кому-то его использовать?

Я знаю, что при обновлении повторно отображается последняя отправленная страница. Почему Page.IsPostback сбрасывается в False, а ViewState сносится?

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

Обновление до исходного сообщения:

Теперь я думаю, что это связано с постбэками, которые выполняются в результате нажатия на кнопки, которые находятся внутри UpdatePanel. Может ли кто-нибудь помочь пролить свет на это?

Ответы [ 5 ]

4 голосов
/ 16 декабря 2009

Когда клиент обновляет свой браузер, он повторно отправляет последний полный запрос страницы, выданный клиентом (который может быть GET или POST ). Он никогда не отправляет запросы AJAX, например, созданные триггерами событий панели обновления («частичные обратные вызовы страниц»).

Тот факт, что Page.IsPostback равен false, когда вы обновляете страницу, означает, что ваш исходный запрос - GET, поэтому вот что, вероятно, происходит:

1) Во время первоначального запроса клиент не отправляет данные формы на сервер - следовательно, нет скрытого поля, содержащего данные о состоянии просмотра ( Общие сведения о состоянии представления ASP.NET довольно подробные, но их можно прочитать Вы хотите действительно понять, что происходит). При обработке этого запроса ASP.NET может отправить клиенту некоторое состояние просмотра, но исходный запрос - это просто URL.

2) Когда пользователь нажимает кнопку внутри UpdatePanel, он запускает частичную обратную передачу, во время которой MyField устанавливается на 1. UpdatePanel изменяет состояние просмотра клиента, чтобы отразить новое значение.

На этом этапе, если пользователь отправляет запрос POST обычными средствами, такими как нажатие кнопки, состояние просмотра будет содержать обновленную информацию.

Если пользователь нажимает «Обновить», он повторно отправляет исходный запрос, начиная с шага 1, без данных формы и, следовательно, без состояния просмотра.

1 голос
/ 16 декабря 2009

Где вы устанавливаете ViewState? И где вы перечитываете значение ViewState? Может быть, нужно проверить его содержимое, прежде чем asp.net вызовет метод LoadViewState ().

0 голосов
/ 05 апреля 2018

Не знаю, почему это работает, но у меня была проблема similair, и я решил ее, поместив эту строку в form_load:

me.myProperty = me.myProperty

, где

Public Property myProperty() as String
Get
  If Not IsNothing(ViewState("data")) Then
    Return CType(ViewState("data"), String)
  Else
    Return String.Empty
  End If
End Get
Set(value As String)
  ViewState("data") = value
End Set
0 голосов
/ 17 декабря 2009

Ваш вопрос: «Зачем кому-то его использовать?»

Viewstate пригодится для данных, которые, как вы знаете, генерируются постом назад. Нажав кнопку «Обновить» - это не сообщение назад, а свежий запрос.

Итак, предположим, что вы просматриваете сетку данных и вам нужно знать определенные биты данных о том, на что они кликнули, при событии щелчка вы можете сохранить эти данные в состоянии просмотра и обработать их в другое время в жизненном цикле страницы, или последующие посты.

Преимущество ViewState заключается в том, что он просто встроен в HTML, поэтому он полностью на стороне клиента. Где SessionState находится на стороне сервера, и если вы храните большое количество данных в сеансе, вы можете заставить ваш веб-сервер или сервер базы данных работать более усердно для обработки этих данных.

Надеюсь, это поможет.

0 голосов
/ 16 декабря 2009

Пользователь, нажимающий на обновление и использующий панель обновления, не будет работать вместе очень хорошо. Я уверен, что именно поэтому люди говорят, что WebForms предоставляет утечку абстракции веб-программирования, а некоторые переходят на mvc.

Если вы не заинтересованы в переносе, я бы посоветовал вам не использовать панель обновления для слишком длительных или больших операций, где вы можете предположить, что пользователь может обновить страницу. Используйте его для мелких вещей, таких как выпадающие элементы, меняющиеся при изменении выбора в раскрывающемся списке1.

Объединение большого количества функций в одной панели обновления вызовет проблемы, если вы просто зависите от viewstate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...