Как в ASP.NET вы справляетесь с сеансом и несколькими вкладками?

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

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

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


person Dan Scott    schedule 15.01.2009    source источник


Ответы (7)


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

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

Это даст следующие потоки Add->[Post]->Edit->..... Add->[Post]->Edit->[Back button]->Add->[Post]->Edit-> [Сообщение]->Редактировать....

person Ken Henderson    schedule 15.01.2009

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

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

person Trent    schedule 15.01.2009

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

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

person Paige Watson    schedule 15.01.2009

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

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

person mbillard    schedule 15.01.2009

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

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

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

person Dan Scott    schedule 15.01.2009

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

person Trent    schedule 15.01.2009

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

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

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

person Dan Scott    schedule 15.01.2009