#asp.net-mvc #web-services #session #session-variables
#asp.net-mvc #веб-сервисы #сессия #переменные сеанса
Вопрос:
Я разрабатываю веб-приложение, ничего особенного.
Там много пользователей, и у каждого пользователя есть много проектов.
Для хранения данных я использовал контейнер сеанса.
Когда пользователь открывал проект, это было похоже (в качестве примера)
Session["projectId"] = current_project_id;
Session["projectName"] = current_project_name;
итак, как вы видите, когда пользователь открывает, скажем, 2-й проект на другой вкладке, данные о 1-м проекте просто заменяются данными 2-го проекта.
Это действительно плохо, да.
Поэтому мне было интересно, как создать приложение таким образом, чтобы разные пользователи могли открывать свои разные проекты на разных вкладках, и все работало нормально, без какой-либо потери данных.
Я читал о TempData
и ViewBag
, но все еще не могу представить, как я мог бы заменить эти переменные сеанса.
Что может мне помочь? Что я должен использовать для хранения новых данных для каждой новой вкладки?
Комментарии:
1. Какой тип данных вы храните в сеансе? Зачем вам это нужно в сессии? Сеанс — это не то, что задумано в MVC, поскольку он должен быть более безгосударственным дизайном.
2. @mckeejm Я храню некоторые
id
с целью получения некоторых данных из базы данных в контроллерах3. пример — пользователь выбирает свой проект (или создает его) после его
project_id
сохранения вSession["project_id"]
4. Я хочу, чтобы пользователь мог выбирать несколько проектов и работать с ними как бы параллельно
5. поэтому не храните эти идентификаторы в сеансе, поместите эти идентификаторы в URL и получите их через контроллер таким образом. Это сделает их уникальными для каждой вкладки, поскольку URL-адрес будет другим.
Ответ №1:
Вы могли бы сохранить список или словарь проектов в сеансе:
var projects = new Dictionary<int, string>();
projects.Add(projectId, projectName);
Session["UserProjects"] = projects;
И более поздние версии:
var projects = (Dictionary<int, string>)Session["UserProjects"];
Комментарии:
1. ну, в
projects
переменной есть данные о нескольких проектах? но как я предполагаю выбрать только один wic, который мне нужен из него? Или, может быть, я что-то не так понимаю?2. На основе вашего ProjectID? Если вы хотите сохранить больше деталей, чем просто название проекта, вы можете изменить словарь на
Dictionary<int, Project>
, где Project — это ваша модель проекта.3. Ну, я имею в виду, как он будет хранить разные данные, скажем, для разных вкладок (если на этих вкладках были открыты разные проекты, конечно) и использовать только один контейнер, когда один проект был открыт на нескольких вкладках и т. Д
4. На каждой вкладке есть информация о проекте. Каждый проект идентифицируется по идентификатору проекта. Каждая вкладка имеет проект и, следовательно, знает идентификатор проекта. Вы запрашиваете у сеанса сведения о проекте:
((Dictionary<int, Project>)Session["UserProjects"])[projectId]
5. Спасибо, я пытаюсь переписать материал таким образом! ( 1, если это будет работать идеально, как мне нужно, я отмечу это как ответ :))