【问题标题】:How in ASP.NET, do you deal with session and multiple tabs?在 ASP.NET 中,您如何处理会话和多个选项卡?
【发布时间】:2009-01-16 03:19:32
【问题描述】:

我在 ASP.net 中编写了一个应用程序,旨在让用户将记录添加到数据库中。页面设置当用户添加记录时,在session中设置新添加记录的ID号,页面Response.Redirects到一个“Thank you for submit”页面,然后重定向回原来的页面允许进一步的编辑。用户还可以使用此屏幕上的返回按钮返回到原始记录添加页面,从而可以对数据进行编辑。

但是,我发现将 ID 存储在会话中并不是一个非常好的解决方案,因为用户可能会尝试在不同的选项卡或窗口中创建两个文档。我也尝试在文字控件中设置 ID,但这会导致问题,即当用户使用后退按钮时,文字控件未设置为 ID,并且会添加新记录而不是编辑记录。

有什么解决办法吗?

【问题讨论】:

    标签: asp.net session-state


    【解决方案1】:

    我建议将您的 ID 存储在 QueryString 中。添加记录后,重定向到您的“谢谢”页面,然后我猜该页面包含指向编辑表单的链接,您将使用查询字符串中的 ID 生成该链接。当该链接被点击时,编辑页面应该将 ID 从查询字符串中提取出来,以便加载正确的记录进行编辑。

    您的添加和编辑表单甚至可以是同一个页面,当在查询字符串中提供 ID 时,您的表单知道要编辑该记录,否则您的表单会添加一条新记录。

    【讨论】:

      【解决方案2】:

      愚蠢的问题,为什么用户可以使用返回按钮来编辑刚刚在帖子中接受的数据?

      如果编辑以前发布的数据是一种常见情况,为什么不直接在接受数据时重定向到允许他们编辑的页面。然后,如果点击后退按钮,他们将回到原来的“干净”插入/添加新数据页面。

      这将给出以下流程 添加->[发布]->编辑->..... 添加->[发布]->编辑->[返回按钮]->添加->[发布]->编辑->[发布]->编辑....

      【讨论】:

        【解决方案3】:

        您是否尝试在查询字符串中添加 ID?然后您可以阅读它,并根据需要将其添加到会话中(比如用户单击后退按钮)。

        在使用后退按钮时允许在呈现的页面中编辑对象似乎有很多问题。给他们一个编辑按钮会不会太过分了?

        【讨论】:

          【解决方案4】:

          控件将其状态保存在 ViewState 中。如果您选择使用 SessionState 而不是 ViewState 来存储信息,则控件会将其状态保存在会话状态中,并且无法与多个选项卡一起正常工作。

          我还没有找到在仍然使用 SessionState 的同时绕过这个问题的方法。我们的解决方案是使用普通的 ViewState。

          【讨论】:

            【解决方案5】:

            我尝试将 ID 存储在查询字符串中(这对于编辑来说非常好),但问题是当他们使用后退按钮时信息存储在会话中。如果用户执行以下操作:

            1. 用户创建一条记录(第一条记录),ID 在查询字符串中传递,并临时存储在会话中。
            2. 用户创建另一条记录(第二条记录),ID 在查询字符串中传递,临时存储在会话中。
            3. 用户使用第一条记录上的后退按钮转到没有查询字符串的页面。

            这可能是一个牵强附会的场景,但它可能会发生。我唯一的解决方案是阻止使用后退按钮返回添加页面,方法是在 JavaScript 中使用 window.history.forward()。但这作为一种解决方案是很糟糕的。

            【讨论】:

              【解决方案6】:

              我的问题是,为什么要在会话中存储任何内容?如果您可以避免在会话中存储任何内容,我认为您会更好。

              【讨论】:

                【解决方案7】:

                考虑到这一点,以下听起来是不是我上面概述的问题的一个不错的解决方案?

                • 首次添加记录时,将访问添加页面时的时间戳存储在隐藏字段中。
                • 当用户单击保存时,此时间戳会通过会话传递。连同 ID。
                • 如果用户同时打开另一个选项卡并保存,则新页面的时间戳将通过会话传递。
                • 如果用户尝试访问第一条记录的添加页面(使用后退按钮),系统会查找会话,并查看是否有时间戳,以及它是否与该页面的隐藏字段中的时间戳匹配。
                • 如果不匹配,则用户会收到提示,并告知正确编辑记录。

                这听起来合理还是过于复杂?

                【讨论】:

                  猜你喜欢
                  • 2018-07-05
                  • 1970-01-01
                  • 2014-09-24
                  • 1970-01-01
                  • 2011-02-19
                  • 1970-01-01
                  • 2012-01-29
                  • 1970-01-01
                  • 2023-03-14
                  相关资源
                  最近更新 更多