Как в ASP.NET вы имеете дело с сессией и несколькими вкладками? - PullRequest
4 голосов
/ 15 января 2009

Я написал приложение на ASP.net, которое разработано, чтобы позволить пользователю добавлять записи в базу данных. Страница настроена так, что когда пользователь добавляет запись, идентификационный номер вновь добавленной записи устанавливается в сеансе, страница Response.Redirects перенаправляется на страницу «Спасибо за отправку», затем перенаправляет обратно на исходную страницу, чтобы дальнейшие правки. Пользователи также могут использовать кнопку «Назад» на этом экране, чтобы вернуться к исходной странице добавления записей, что позволяет им вносить изменения в данные.

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

Есть ли какое-нибудь решение для этого?

Ответы [ 7 ]

5 голосов
/ 15 января 2009

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

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

1 голос
/ 15 января 2009

Глупый вопрос, почему пользователь может использовать кнопку «Назад» для редактирования данных, только что принятых в посте?

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

Это даст следующие потоки Добавить -> [сообщение] -> Edit -> ..... Добавить -> [Опубликовать] -> Редактировать -> [Кнопка назад] -> Добавить -> [Опубликовать] -> Редактировать -> [Опубликовать] -> Редактировать ....

1 голос
/ 15 января 2009

Вы пытались добавить идентификатор в строку запроса? Затем вы можете прочитать его и добавить его в сеанс по мере необходимости (скажем, при нажатии пользователем кнопки «Назад»).

Похоже, много проблем, связанных с редактированием объекта на странице, отображаемой при использовании кнопки «Назад». Было бы слишком много, чтобы вместо этого дать им кнопку редактирования?

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

Подумав об этом, звучит ли следующее приличное решение проблемы, которую я обрисовал выше?

  • При первом добавлении записи сохраняйте отметку времени, когда была добавлена ​​страница добавления, в скрытом поле.
  • Эта метка времени пропускается через сеанс, когда пользователь нажимает сохранить. Вместе с удостоверением личности.
  • Если пользователь одновременно открывает другую вкладку и сохраняет данные, тогда отметка времени новой страницы передается через сеанс.
  • Если пользователь пытается получить доступ к странице добавления первой записи (используя кнопку «назад»), система ищет сеанс и определяет, есть ли временная метка и соответствует ли она метке в скрытом поле для этой страницы.
  • Если он не совпадает, то пользователь получает приглашение и велит правильно отредактировать запись.

Звучит разумно или слишком сложно?

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

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

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

Я пытался сохранить идентификатор в строке запроса (что в основном подходит для редактирования), но проблема в том, что информация сохраняется в сеансе, когда они используют кнопку Назад. Если пользователь делает следующее:

  1. Пользователь создает запись (1-я запись), идентификатор передается в строке запроса и временно сохраняется в сеансе.
  2. Пользователь создает еще одну запись (2-ую запись), идентификатор передается в строке запроса, временно сохраняется в сеансе.
  3. Пользователь использует кнопку Назад на первой записи, чтобы перейти на страницу, на которой нет строки запроса.

Это, вероятно, надуманный сценарий, но это может произойти. Единственное решение, которое у меня есть, - заблокировать использование кнопки «Назад» для возврата на страницу добавления, используя window.history.forward () в JavaScript. Но это как решение ужасно.

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

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

Я еще не нашел способ обойти эту проблему, все еще используя SessionState. Нашим решением было использовать обычный ViewState.

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