Как в ASP.NET вы справляетесь с сеансами и несколькими вкладками?
-
22-07-2019 - |
Вопрос
Я написал приложение на ASP.net, позволяющее пользователю добавлять записи в базу данных.Страница настроена так, что когда пользователь добавляет запись, идентификационный номер вновь добавленной записи устанавливается в сеансе, страница Response. Перенаправляется на страницу «Спасибо за отправку», а затем перенаправляется обратно на исходную страницу, чтобы разрешить дальнейшие правки.Пользователи также могут использовать кнопку «Назад» на этом экране, чтобы вернуться на исходную страницу добавления записи, что позволяет им вносить изменения в данные.
Однако я обнаружил, что сохранение идентификатора в сеансе — не очень хорошее решение, поскольку пользователь может попытаться создать два документа в разных вкладках или окнах.Я также пробовал установить идентификатор в литеральном элементе управления, но это вызывает проблему: когда пользователь использует кнопку «Назад», буквальный элемент управления не устанавливается на идентификатор, и вместо редактируемой записи добавляются новые записи.
Есть ли какое-то решение для этого?
Решение
Глупый вопрос, почему пользователь может использовать кнопку «Назад» для редактирования данных, только что принятых в сообщении?
Если редактирование ранее опубликованных данных является распространенным сценарием, почему бы не просто перенаправить на страницу, когда данные приняты, что позволяет им редактировать их. Затем, если нажать кнопку «Назад», они вернутся к исходному «очищению». вставить / добавить новую страницу данных.
Это даст следующие потоки Добавить- & триазоло [сообщение] - & GT; Редактирование- & GT; ..... Добавить- [Опубликовать] -> Редактировать -> [Кнопка назад] -> Добавить- [Опубликовать] -> Редактировать-> Опубликовать -> Изменить ....
Другие советы
Я бы порекомендовал сохранить ваш идентификатор в QueryString. После добавления записи перенаправьте ее на «спасибо» страница, которая, как мне кажется, содержит ссылку на форму редактирования, которую вы сгенерируете с идентификатором в строке запроса. При переходе по этой ссылке страница редактирования должна извлечь идентификатор из строки запроса, чтобы загрузить правильную запись для редактирования.
Ваша форма добавления и редактирования может быть даже на одной странице, если в строке запроса указан идентификатор, ваша форма знает, как редактировать эту запись, в противном случае ваша форма добавляет новую запись.
Вы пытались добавить идентификатор в строку запроса? Затем вы можете прочитать его и добавить в сеанс по мере необходимости (например, если пользователь нажмет кнопку «Назад»).
Похоже, много проблем, связанных с редактированием объекта на странице, отображаемой при использовании кнопки «Назад». Было бы слишком много, чтобы вместо этого дать им кнопку редактирования?
Элементы управления сохраняют свое состояние в ViewState. Если вы решите использовать SessionState вместо ViewState для хранения информации, тогда элементы управления сохранят свое состояние в состоянии сеанса и не будут работать должным образом с несколькими вкладками.
Я еще не нашел способ обойти эту проблему, все еще используя SessionState. Нашим решением было использовать обычный ViewState.
Я попытался сохранить идентификатор в строке запроса (что в основном подходит для редактирования), но проблема в том, что информация сохраняется в сеансе, когда они используют кнопку Назад. Если пользователь делает следующее:
<Ол>Это, вероятно, надуманный сценарий, но он может произойти. Единственное решение, которое у меня есть, - заблокировать использование кнопки «Назад» для возврата на страницу добавления, используя window.history.forward () в JavaScript. Но это как решение ужасно.
Мой вопрос к вам: почему вы что-то храните в сеансе для начала? Если вы можете избежать сохранения чего-либо в сеансе, я думаю, что вам будет лучше в целом.
Поразмыслив над этим, не кажется ли следующее достойным решением проблемы, которую я изложил выше?
- При первом добавлении записи сохраните временную метку доступа к странице добавления в скрытом поле.
- Эта временная метка передается через сеанс, когда пользователь нажимает кнопку «Сохранить».Вместе с удостоверением личности.
- Если пользователь одновременно открывает другую вкладку и сохраняет ее, то временная метка новой страницы передается через сеанс.
- Если пользователь пытается получить доступ к странице добавления первой записи (с помощью кнопки «Назад»), система ищет сеанс и проверяет, есть ли метка времени и соответствует ли она метке в скрытом поле для этой страницы.
- Если оно не совпадает, пользователю будет предложено отредактировать запись должным образом.
Звучит ли это разумно или слишком сложно?