在ASP.NET中,您如何处理会话和多个标签?

时间:2009-01-15 17:30:00

标签: asp.net session-state

我在ASP.net中编写了一个应用程序,旨在让用户将记录添加到数据库中。页面设置为当用户添加记录时,新添加的记录的ID号在会话中设置,页面Response.Redirects到“感谢您提交”页面,然后重定向回原始页面以允许进一步编辑。用户还可以使用此屏幕上的“返回”按钮返回原始记录添加页面,这样他们就可以对数据进行编辑。

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

对此有什么解决方案吗?

7 个答案:

答案 0 :(得分:5)

我建议您将您的ID存储在QueryString中。添加记录后,重定向到“thankyou”页面,然后我猜测该页面包含一个指向编辑表单的链接,您将使用查询字符串中的ID生成该表单。当遵循该链接时,编辑页面应该从查询字符串中提取ID,以便加载要编辑的正确记录。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

这将提供以下流程 添加 - > [发布] - GT;编辑 - > ..... 添加 - > [发布] - >编辑 - > [后退按钮] - >添加 - > [发布] - >编辑 - > [发布] - >编辑....

答案 3 :(得分:0)

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

在使用SessionState时,我还没有找到绕过此问题的方法。我们的解决方案是使用普通的ViewState。

答案 4 :(得分:0)

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

  1. 用户创建记录(第一条记录),ID在查询字符串中传递,并暂时存储在会话中。
  2. 用户创建另一条记录(第二条记录),ID在查询字符串中传递,暂时存储在会话中。
  3. 用户使用第一条记录上的“后退”按钮转到没有查询字符串的页面。
  4. 这可能是一个牵强附会的场景,但它可能会发生。我唯一的解决方案是使用JavaScript中的window.history.forward()阻止使用Back按钮返回添加页面。但这作为解决方案很糟糕。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

考虑到这一点,以下听起来像是我在上面概述的问题的合理解决方案吗?

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

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