4

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

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

有什么解决方案吗?

4

7 回答 7

5

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

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

于 2009-01-15T17:36:19.110 回答
1

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

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

于 2009-01-15T17:36:29.717 回答
1

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

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

这将给出以下流程 Add->[Post]->Edit->..... Add->[Post]->Edit->[Back button]->Add->[Post]->Edit-> [发布]->编辑....

于 2009-01-15T18:27:20.223 回答
0

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

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

于 2009-01-15T17:33:02.347 回答
0

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

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

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

于 2009-01-15T18:02:19.697 回答
0

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

于 2009-01-15T18:13:10.987 回答
0

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

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

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

于 2009-01-15T19:19:32.850 回答