在整个 MVC 应用程序中保留布局文件中控件的选定值

Persist selected values of control(s) from the Layout file across the MVC application

我有一个 Layout 页面,它使用 Telerik's ComboBox 在应用程序中设置项目列表,如图所示。 combobox 允许用户 select 一个 he/she 想要从事的项目。

完成 selection 后,我希望应用程序中的所有后续操作都应与 selected 项目相对应。我可以在 Session 中保留项目信息,但是如果用户选择在新选项卡中打开它,并且在第二个选项卡中用户切换到另一个项目并返回到第一个选项卡并刷新页面,那么会话信息(项目)会发生变化,这会在我的应用程序中产生问题。

那么,什么是我保存 Layout.cshtml 控件的项目信息的最佳方式,以便我可以在我的应用程序中使用它,以便呈现的每个页面都使用 currently/correctly selected 值。

Tempdata / QueryStrings 出现在我的脑海中,但我不知道它们是否能合理地解决我的问题。如果是,那么我应该如何通用地使用它们(特别是 querystrings)而不会使我的解决方案复杂化?

localStroagesessionStorage 似乎也是相关的解决方案,但是在用户从现有页面打开新选项卡的情况下如何使用它们? Project # 将如何在新打开的 page/window/tab 上持续存在?

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.

我本以为这是期望的行为...以 whosebug.com 为例,如果我在一个浏览器选项卡中更改我的用户名,我希望我的用户名在其他浏览器中更新-选项卡也是...如果我刷新我的其他选项卡,就会发生这种情况。

没有用于在不同浏览器选项卡中分别维护用户信息的内置解决方案...实现此目的的唯一方法是在 URL 中来回发送项目名称...但是如果用户更改 URL,您将丢失此信息...在我看来,这是一个临时解决方案,不值得开发,因为这是一种非常罕见的情况。


获得您的选择:

  • 存储用户信息是会话变量的一个非常典型的用例。

  • TempData is stored in Session by default。虽然你可以写 您自己的自定义 TempDataProvider 并将其存储在其他地方(例如 数据库、cookie 等)。参见 Brok Allen's Cookie TempDataProvider 举个例子。使用 Cookie 的优势之一是您可以发送您的 会话变量随请求来回变化,因此您不需要 担心 Sticky Sessions.

  • 当然可以使用永久存储,比如DB/Disk.

  • 如果项目名称不是敏感信息,那么在查询字符串中传递它没有任何问题。

这样的事情是可以实现的,如果你确保 url 在制造 select 离子时发生变化。

假设您 select 在下拉框中投射 C-1379,那么您的 url 可能会变成 http://localhost:58692/pid=C-1379

从现在开始,您的页面可以加载所需的数据,从查询字符串中检索所需的信息。不要使用会话或本地存储或类似的东西,因为它不会工作。

这样,您仍然可以在布局页面中加载项目列表,您可以 select 基于查询字符串值的项目列表,然后通过 api 调用加载一些默认值后端。

如果您从现在开始的所有工作都是基于 api 调用完成的,例如,您更改了一些属性,然后发出 POST 来更新所述详细信息,那么这是也很容易做到。

telerik 控件通常有一些与之关联的事件。您正在使用的那个应该有一个 onChange 或类似的东西。在这里您可以使用项目 selected 的值更新查询字符串,然后您可以继续执行您需要的操作