Сохранять выбранные значения элементов управления из файла макета в приложении MVC

У меня есть страница Layout, которая устанавливает список проектов в приложении с использованием Telerik's ComboBox, как показано. combobox позволяет пользователю выбрать проект, над которым он хочет работать.

Сохранять выбранные значения элементов управления из файла макета в приложении MVC

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

Итак, как мне лучше всего сохранить информацию Project для элементов управления Layout.cshtml, чтобы я мог использовать ее в своем приложении, чтобы каждая отображаемая страница использовала текущие / правильно выбранные значения.

Мне пришли в голову Tempdata / QueryStrings, но я не знаю, будут ли они разумным решением моей проблемы. Если да, то как мне использовать их в целом (особенно querystrings), не усложняя мое решение?

localStroage и sessionStorage также кажутся подходящими решениями, но как тогда использовать их в сценарии, когда пользователь открывает новую вкладку с существующей страницы? Каким образом Project # будет сохраняться на вновь открытой странице / окне / вкладке?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
282
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

I can preserve the Project information in a Session but then if user chooses to open this in a new tab and in 2nd tab users switches to a different Project and comes back to the first tab and refreshes the page then the session information (Project) would have changed which will create issues in my application.

Я бы подумал, что это желаемое поведение ... возьмите stackoverflow.com в качестве примера, если я изменю свое имя пользователя на одной вкладке браузера, я бы ожидал, что мое имя пользователя будет обновлено и на других вкладках браузера ... и вот что происходит, если я обновляю другую вкладку.

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


Приступаем к вашим вариантам:

  • Хранение информации о пользователе - типичный вариант использования переменной сеанса.

  • По умолчанию TempData хранится в Session. Хотя вы можете написать ваш собственный TempDataProvider и храните его в другом месте (например, база данных, файлы cookie и т. д.). См. TempDataProvider Cookie Брока Аллена В качестве примера. Одним из преимуществ использования файлов cookie является то, что вы отправляете свой переменная сеанса вперед и назад с запросом, поэтому вам не нужно беспокоиться о Прикрепленные сеансы.

  • Конечно, вы можете использовать постоянное хранилище, такое как DB / Disk.

  • Если имя проекта не является конфиденциальной информацией, я не вижу проблем с передачей его в строке запроса.

Все функции приложения будут отображать данные в зависимости от проекта, который пользователь выбрал в combobox. В каждой вкладке / окне я хочу, чтобы пользователь мог работать с отдельными проектами. Это сильно отличается от вашего примера (имя пользователя).

WAQ 23.01.2019 08:34
Ответ принят как подходящий

что-то подобное возможно, если вы убедитесь, что URL-адрес изменится при выборе.

Итак, предположим, вы выбрали проект C-1379 в раскрывающемся списке, в этот момент ваш URL-адрес может стать http: // локальный: 58692 / pid = C-1379.

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

Таким образом, вы по-прежнему можете загрузить свой список проектов на страницу макета, и вы можете выбрать один на основе значения строки запроса, а затем загрузить некоторые значения по умолчанию через вызовы api в серверную часть.

Если с этого момента вся ваша работа выполняется на основе вызовов api, например, у вас есть некоторые свойства, которые вы изменяете, а затем вы запускаете POST для обновления указанных деталей, то это тоже очень легко сделать.

Элементы управления Telerik обычно имеют связанные с ними события. тот, который вы используете, должен иметь по изменению или что-то в этом роде. Здесь вы должны обновить строку запроса значением выбранного проекта, а затем вы можете продолжить делать то, что вам нужно.

Итак, как мне убедиться, что мой URL-адрес всегда содержит pid = C-1379? Есть ли какой-либо способ сделать это по умолчанию или автоматически? или вручную в каждом запросе я должен отправлять этот параметр?

WAQ 23.01.2019 10:36

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

Andrei Dragotoniu 23.01.2019 11:10

но в моем приложении будет много мест, где пользователь будет выполнять запросы Get и Post, открывать ссылки в новом Tab/Windows и т. д. Во всех таких случаях мне нужно добавить информацию о проекте в Query String. Итак, чтобы избежать этих дополнительных усилий (а это много с точки зрения затрат на разработку и обслуживание), существует ли какое-нибудь простое решение, с помощью которого выбранный № проекта всегда добавляется к Query String?

WAQ 23.01.2019 11:16

Я думаю, вам нужно добавить больше информации о том, в чем ваша проблема. Запросы Get и Post будут запускаться со страницы проекта (верно?), И в этом случае вы используете javascript для заполнения его из строки запроса загруженной страницы проекта. Открытие новых ссылок в новых вкладках осуществляется путем нажатия на ссылки, поэтому, где бы у вас ни была ссылка, вы обязательно добавите идентификатор проекта, опять же с помощью javascript. Я не понимаю, в чем трудность.

Andrei Dragotoniu 23.01.2019 11:21

как я уже сказал в исходном вопросе, файл _Layout будет иметь элемент управления, заполненный всеми проектами. Какой бы проект ни был выбран, каждое действие в приложении должно соответствовать этому номеру проекта. Наиболее очевидным решением является то, что любой запрос (с любой страницы / представления / контроллера) должен включать параметр Project #. Я хочу знать, есть ли у них нестандартное решение для этого? чтобы мне не приходилось отправлять Project # вручную? например Переменная Session была вариантом, но не работает для меня, потому что я хочу, чтобы пользователь работал с разными проектами в разных Tabs/Windows.

WAQ 24.01.2019 05:37

@WAQ Не думаю, что вы найдете решение своей проблемы, которое не потребовало бы как минимум такой доработки, как решение, представленное здесь Андреем. Мы использовали MVC Routing для достижения аналогичных требований в прошлом, но вам все равно нужно передавать свой ProjectId в соответствующих местах. Причина, по которой нет более простого нестандартного способа, заключается в том, что, как вы уже поняли, сеансы и другие вещи разделяются между вкладками. То, что вы пытаетесь достичь, не может управляться сессиями, и вам придется делать это с помощью параметров.

Matt Shepherd 25.01.2019 02:55

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