English 中文(简体)
在ASP.NET中,如何处理会话和多个标签页?
原标题:
  • 时间:2009-01-15 17:30:00
  •  标签:

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

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

这个有什么解决方案吗?

最佳回答

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

如果以前发布的数据的编辑是一个常见的情况,为什么不在数据被接受时直接重定向到一个页面,让他们进行编辑呢?那么,如果他们点击后退按钮,他们将返回到最初的“干净”的插入/添加新数据页面。

This would give the following flows Add->[Post]->Edit->..... Add->[Post]->Edit->[Back button]->Add->[Post]->Edit->[Post]->Edit....

问题回答

我建议将你的ID存储在查询字符串中。在添加记录后,重定向到你的“谢谢”页面,该页面包含一个链接到编辑表单的页面,该链接将生成包含查询字符串中的ID的表单。当单击该链接时,编辑页面应从查询字符串中提取ID以加载正确的记录进行编辑。

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

您尝试过将ID添加到查询字符串中吗?然后您就可以读取它,并在需要时将其添加到会话中(例如用户单击后退按钮时)。

在使用“返回”按钮渲染页面时,允许编辑对象似乎存在很多问题。给他们一个编辑按钮是否太多了?

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

我还没有找到一种能继续使用SessionState但又能规避这个问题的方法。我们的解决方案是使用普通的ViewState。

我尝试把ID存储在查询字符串中(这对于编辑大多数情况下是可以的),但问题是当信息在会话中存储时,当他们使用返回按钮时。如果用户执行以下操作:

  1. User creates a record (1st record), the ID is passed along in the querystring, and temporarily stored in session.
  2. User creates another record (2nd record), the ID is passed along in the querystring, temporarily stored in session.
  3. User uses the Back button on the first record to go to the page that doesn t have the querystring.

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

我对你的问题是,为什么一开始要将任何东西存储在会话中?如果您可以避免在会话中存储任何内容,我认为您将受益匪浅。

经过思考,以下方案是否像是解决上述问题的不错选择?

  • When first adding a record, store a timestamp of when the add page was accessed in a hidden field.
  • This timestamp is passed through session when the user clicks save. Along with the ID.
  • If the user opens another tab at the same time and saves, then the new page s timestamp gets passed through session.
  • If the user tries to access the add page of first record (using the back button), the system looks up session, and sees if there is a timestamp, and whether it matches the one in the hidden field for that page.
  • If it doesn t match, then the user gets a prompt, and told to edit the record properly.

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





相关问题
热门标签