【问题标题】: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 存储在查询字符串中(这对于编辑来说非常好),但问题是当他们使用后退按钮时信息存储在会话中。如果用户执行以下操作:
- 用户创建一条记录(第一条记录),ID 在查询字符串中传递,并临时存储在会话中。
- 用户创建另一条记录(第二条记录),ID 在查询字符串中传递,临时存储在会话中。
- 用户使用第一条记录上的后退按钮转到没有查询字符串的页面。
这可能是一个牵强附会的场景,但它可能会发生。我唯一的解决方案是阻止使用后退按钮返回添加页面,方法是在 JavaScript 中使用 window.history.forward()。但这作为一种解决方案是很糟糕的。
【解决方案6】:
我的问题是,为什么要在会话中存储任何内容?如果您可以避免在会话中存储任何内容,我认为您会更好。
【解决方案7】:
考虑到这一点,以下听起来是不是我上面概述的问题的一个不错的解决方案?
- 首次添加记录时,将访问添加页面时的时间戳存储在隐藏字段中。
- 当用户单击保存时,此时间戳会通过会话传递。连同 ID。
- 如果用户同时打开另一个选项卡并保存,则新页面的时间戳将通过会话传递。
- 如果用户尝试访问第一条记录的添加页面(使用后退按钮),系统会查找会话,并查看是否有时间戳,以及它是否与该页面的隐藏字段中的时间戳匹配。
- 如果不匹配,则用户会收到提示,并告知正确编辑记录。
这听起来合理还是过于复杂?