Звучит так, как будто вы пытаетесь сделать следующее:
Например, допустим, у вас есть двухстраничный вопросник, первая страница имеет имя, а вторая - фамилия.,Вы хотите, чтобы пользователь мог открывать две вкладки и находиться на разных страницах вопросника при вводе разных данных в вопросник на каждой вкладке.
Таким образом, на вкладке A вы ввели «Имя» в качестве имени и отправилии теперь вы находитесь на второй странице на вкладке А. Вы решаете, что собираетесь сделать вопрос также для своего друга, поэтому вы открываете новую вкладку В. На вкладке В вы вводите Тома и отправляете страницу.
В настоящее время в браузере имеется вкладка A, которая находится на странице 2 вопросника с firstname = "Mark", и вкладка B, которая находится на странице 2 вопросника с first name = "Tom".Предполагая, что вы хотите сохранить оба этих параметра в сеансе на сервере, я полагаю, что этот подход вам подойдет.
Когда веб-браузер запрашивает страницу 1 вашей формы по запросу GET (нет опубликованных вопросников)данные на сервер), вы предоставляете скрытое поле в HTML-ответ и генерировать случайное число для хранения в этом поле.Когда эта форма отправляется, вы делаете на сервере следующее:
- Просмотр сеанса с использованием случайного числа в качестве ключа "var questionaire = session [Request.Form [" questionaire_rnumber "]]
если вопросник не находится в сеансе, вы создаете новый вопросник, обновляете его свойства и вставляете его в сеанс
var questionaire = new Questionaire ();questionaire.FirstName = Request.Form ["firstName"]сеанс [Request.Form ["questionaire_rnumber"]] = вопросник;
, если вопросник находился в сеансе, вы просто обновляете объект и отображаете следующую страницу, однако при отображенииНа следующей странице вы снова захотите указать скрытое поле случайных чисел в html, используя то же случайное число, которое вы использовали на странице 1.
Таким образом, вы можете хранить любое количество вопросников в одном сеансе.С MVC.NET вам будет просто добавить поле случайных чисел в вашу модель представления и добавить логику для поиска в сеансе существующего вопросника или создания нового, и я думаю, что вам будет хорошо.
Также следует помнить о возможных проблемах с подходом, таких как проблемы с кнопками «назад», проблемы безопасности и производительности.
Одним из примеров безопасности и производительности может быть то, что злоумышленникпонимает, что ваше приложение работает так, и злоумышленник запрашивает страницу 1 вашей формы 10 000 раз и отправляет страницу 1 каждый раз.За один сеанс пользователя у вас будет 10 000 вопросников.Если злоумышленник удалял свой файл cookie с идентификатором сеанса 10000 раз и для каждого файла cookie с идентификатором сеанса он создавал 10 000 запросов на страницу 1 и отправлял форму страницы 1, у вас было бы 100 000 объектов вопросника в совокупности на 10000 сеансов на вашем сервере.Таким образом, вы должны наложить на него некоторые ограничения, чтобы защитить ваше приложение, например:
- В любом отдельном сеансе может быть только X вопросников в сеансе
- Любой отдельный IP-адрес может иметь только Yодновременные сеансы (это вам, вероятно, понадобится отслеживать в объекте приложения)
ДОПОЛНИТЕЛЬНЫЙ ОТВЕТ НА ДОБАВЛЕННЫЙ СЛУЧАЙ ИСПОЛЬЗОВАНИЯ
Спасибо за вариант использования.Мое решение все еще должно работать для вас.У вас есть два варианта.
Если вы хотите убедиться, что с вашим рабочим процессом работает только одна вкладка, то при передаче случайного числа на сервер из новой вкладки вы сможете обнаружить, что идет другой рабочий процесс и что случайное числоиз новой вкладки не совпадает случайное число с первой, поэтому вы выдадите исключение и покажете пользователю сообщение, в котором говорится, что он не может начать новый рабочий процесс, пока не завершит первый, и спросите, хотят ли они отменитьпервый.Вы должны спросить, хотят ли они отменить его, потому что, если они закроют свой браузер в первом запущенном им рабочем процессе, они застрянут, пока не истечет их сеанс.Этого не произойдет, если они продолжат пытаться запустить новый рабочий процесс.
Во-вторых, вы можете разрешить им выполнять несколько операций, но сегментировать контекст каждого рабочего процесса по случайному числу, как предложено в первом ответе.Весь смысл в том, что вы делаете небольшие мини-сессии в своем сеансе, но вводите значение, которое хранится только в клиенте.Таким образом, поскольку каждая вкладка имеет различное случайное число, когда форма отправляет на сервер, легко сопоставить это случайное число с записью в вашем сеансе, которая содержит всю информацию о рабочем процессе, инициированном из этой вкладки.это помогает.