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

Posted

技术标签:

【中文标题】在整个 MVC 应用程序中保留布局文件中选定的控件值【英文标题】:Persist selected values of control(s) from the Layout file across the MVC application 【发布时间】:2019-01-15 10:05:26 【问题描述】:

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

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

那么,对我来说,保存Layout.cshtml 控件的项目信息的最佳方式是什么,以便我可以在我的应用程序中使用它,以便呈现的每个页面都使用当前/正确选择的值。

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

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

【问题讨论】:

【参考方案1】:

如果您确保在进行选择时 url 发生变化,那么这样的事情是可以实现的。

假设您在下拉框中选择项目 C-1379,此时您的 url 可能变为 http://localhost:58692/pid=C-1379。

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

这样,您仍然可以在布局页面中加载您的项目列表,您可以根据查询字符串值选择一个,然后通过 api 调用将一些默认值加载到后端。

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

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

【讨论】:

那么如何确保我的 url 始终包含 pid=C-1379?有没有默认或自动的方式来做到这一点?还是手动在每个请求中,我必须发送这个参数? 添加了更多信息,查看特定 Telerik 控件的文档并找到 onChange 或选择更改时触发的任何事件。 但是在我的应用程序中会有很多地方用户将执行GetPost 请求,在新的Tab/Windows 中打开链接等。在所有这些情况下我需要在Query String 中附加项目信息。因此,为了避免这种额外的工作(这在开发和维护开销方面很多),是否有任何简单的解决方案可以将所选项目#始终附加到Query String 我认为您需要为您的问题添加更多信息。 Get 和 Post 请求将从项目页面运行(对吗?),在这种情况下,您使用 javascript 从加载的项目页面的查询字符串中填充它。在新选项卡中打开新链接是通过单击链接完成的,因此无论您有链接,您都会确保添加项目 ID,再次使用 javascript。我看不出困难在哪里。 就像我在原始问题中所说的那样,_Layout 文件将包含一个包含所有项目的控件。无论选择什么项目,整个应用程序中的每个操作都需要与此项目#相对应。最明显的解决方案是任何请求(来自任何页面/视图/控制器)都应该包含 Project# 参数。我想知道他们是否是一个开箱即用的解决方案来做到这一点?这样我就不必手动发送项目#?例如Session 变量是一个选项,但对我不起作用,因为我希望用户在不同的 Tabs/Windows 中使用不同的项目。【参考方案2】:

我可以在会话中保留项目信息,但如果用户 选择在新选项卡中打开它,并在第二个选项卡中用户切换到 不同的项目并返回到第一个选项卡并刷新 页面然后会话信息(项目)会改变 将在我的应用程序中产生问题。

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

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


获得您的选择:

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

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

您当然可以使用永久存储,例如 DB/Disk。

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

【讨论】:

应用程序的所有功能都将根据用户在combobox 中选择的项目显示数据。在每个选项卡/窗口中,我希望用户能够使用单独的项目。这与您的示例(用户名)非常不同。

以上是关于在整个 MVC 应用程序中保留布局文件中选定的控件值的主要内容,如果未能解决你的问题,请参考以下文章

在 MVC 的回发中保留 hiddenField 值

QT中控件如何随着窗口大小的改变而使它充满整个窗口空间

MVC Bootstrap Navbar - 活动类只保留一个 <li> 元素

保存、保留和检索数组中的选定单元格

ASP.NET MVC载入页面常用方法

将选定的行保持在表格视图控件的中间