Проблемы с использованием сеансов в MVC

#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, если это будет работать идеально, как мне нужно, я отмечу это как ответ :))