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

StackOverflow https://stackoverflow.com/questions/447681

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

<Ол>
  • Пользователь создает запись (1-ую запись), идентификатор передается в строке запроса и временно сохраняется в сеансе.
  • Пользователь создает другую запись (вторая запись), идентификатор которой передается в строке запроса, временно сохраняется в сеансе.
  • Пользователь использует кнопку "Назад" в первой записи, чтобы перейти на страницу, на которой нет строки запроса.
  • Это, вероятно, надуманный сценарий, но он может произойти. Единственное решение, которое у меня есть, - заблокировать использование кнопки «Назад» для возврата на страницу добавления, используя window.history.forward () в JavaScript. Но это как решение ужасно.

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top