Обратная передача ASP.NET ViewState с обновлением страницы и закладками - PullRequest
4 голосов
/ 08 декабря 2008

Функция ASP.NET ViewState иногда может быть обоюдоострым мечом. Я полагаюсь на это в большинстве своих проектов, и это значительно ускоряет разработку.

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

Современные браузеры отображают глупое диалоговое окно, когда пользователь пытается обновить страницу, которая является результатом операции POST (например, обратной передачи asp), которая вообще нежелательна.

Интересно, это способ продолжить использование ViewState и модели обратной передачи, но без недостатка диалогового окна обновления. (и, если возможно, добавьте страницу в закладки).

Примером того, что я мог бы сделать, является наличие страницы с записями и флажками рядом с ними, у пользователя есть возможность проверить все записи, которые он хочет удалить, и затем нажать кнопку удаления. После того, как пользователь нажимает кнопку «Удалить», записи анализируются на сервере, и на новой странице перечисляются все записи, которые были выбраны с помощью кнопки подтверждения удаления. Теперь, если пользователь нажимает кнопку «Обновить», он получает это глупое окно, чтобы подтвердить, хотят ли они оставлять сообщения.

Я понимаю, что ViewState является результатом использования модели Post Back, что означает, что большинство страниц asp.net являются результатом операции POST, но мне интересно, есть ли какие-либо способы обойти это.

Обходные пути, которые, как я думал, могут сработать:
В событии Page_Unload сохраните состояние представления в сеансе с уникальным идентификатором и перенаправьте пользователя на ту же страницу с уникальным идентификатором в качестве параметра строки запроса, после того как страница загрузится с уникальным идентификатором в URL, состояние представления будет загружено из сеанса и вводится в текущую страницу. Такой метод позволит пользователю обновлять страницу и всегда получать одинаковые результаты.

P.S. Я понимаю, что могу использовать Response.Redirect() и / или строки запроса, но я хочу использовать простоту ViewState

Ответы [ 4 ]

2 голосов
/ 10 декабря 2008

Мои 2 цента: вместо того, чтобы использовать простоту ViewState с песком, используйте простоту Session - что на самом деле та же самая простота, и вам не придется беспокоиться о странице обновить и прочее. Более того, сессия более гибкая, так как вы можете использовать ее для хранения не только встроенных типов, не влияя на производительность (вы можете делать это и с ViewState, но это повлияет на производительность).

1 голос
/ 01 января 2011

@ Асаф - я не проголосовал против вашего ответа, но вот несколько причин:

1) Не удается сохранить сложные типы в строке запроса 2) Строка запроса ограничена примерно 2 КБ в IE, что немного 3) Неправильное использование метода GET - GET буквально для «получения» данных (таких как панель поиска Google), а POST для «публикации» данных на сервере для манипулирования данными на сервере (например, контактные формы) , 4) Все, что зависит от Page.IsPostBack перестанет работать.

1 голос
/ 09 декабря 2008

Я выскажу свое мнение по одному.

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

Если вы думаете о поведении закладок, это подразумевает, что я захочу вернуться к этой странице снова и снова, но вполне вероятно, что моя сессия закончится задолго до того, как это произойдет. Таким образом, вы можете сохранить состояние представления в GUID, но тогда вам придется хранить это состояние в базе данных потенциально навсегда. Что если страница изменится за это время? Это представление теперь будет недействительным.

Конечно, в вашем случае вам нужен параметр строки запроса, который будет загружать данные вашего пользователя из базы данных и заполнять страницу во время загрузки страницы как обычно? www.my-site.com/Customer.aspx?Id=90401 или что-то в этом роде.

Мое предложение - не бороться с инструментами. Надеюсь, это поможет.

0 голосов
/ 21 января 2009

Это может быть не элегантное решение, но я думаю, что если вы измените метод формы на GET, это решит и вашу проблему с закладками, и обновите ее.

Это то же , что и при использовании строк запроса, но с абстракцией VIEWSTATE, оставленной нетронутой.

...