首先,感谢您的阅读。
我会尽可能明确地描述我的情况。
我有一个用户可以发表评论的页面。 这是评论流程
- A-1。单击“评论”按钮
- A-2。使用 ajaxtoolkit 中的 ModalPopupExtender 显示带有文本框的模式弹出窗口。
- A-3。用户在文本框中输入评论,然后单击“确定”。
但是,当用户未登录时,预期行为会发生变化。
- B-1。单击“评论”按钮
- B-2。显示带有 id 和 pwd 文本框的登录模式弹出窗口。
- B-3。用户输入 ID 和密码,然后单击“确定”。
- B-4。显示评论模式弹出窗口
- B-5。用户输入评论并单击“确定”。
我在处理此案时遇到问题。
当 B-3 发生时,页面被回发,我登录用户,更新 session 对象,然后我 Response.Rediect() 页面自身以显示正确的登录状态(我必须..)。 重定向后,在 Page_Load() 中,我需要检查一些值以显示 Comment-Modal-Popup。 但我不知道如何..
这是我的考虑
- View 状态
- 我只是无法使用它,因为页面已重定向而不是回发。
- 查询字符串
- 我可以在重定向时在 URL 上添加“showCommentPopup=1”,但这会在 URL 中留下不需要的 QueryString。我不希望用户滥用它。
- session
- 我实际上使用了 Session 对象。在重定向之前,我将 Session[ "ShowCommentPopup"] 设置为 true。如果在 Page_Load() 中设置了它,我会将其删除并显示弹出窗口。
当用户在多个选项卡中打开同一页面时,像我一样使用 session 无法正常工作。
- 用户打开两个具有相同 URL 的选项卡(在 Firefox 中)
- 用户在第一个选项卡中执行从 B-1 到 B-3 的步骤。
- 在页面在 B-3 和 B-4 之间重定向之前,用户刷新第二个选项卡。
- 如果时机正确,评论弹出窗口将显示在第二个选项卡中。
我希望听到来自 stackoverflow 的深刻见解..
最佳答案
我还没有尝试过这个,但我认为如果您将 ShowCommentPopup
标志存储在 HttpContext.Items
集合中而不是 session 中,然后使用 Server. Transfer
而不是 Response.Redirect
您应该能够达到预期的结果。
HttpContext.Items
是一个字典,可用于存储其生命周期为请求生命周期的数据。这意味着来自不同选项卡或窗口的第二个请求将具有不同的 HttpContext.Items 字典。
Server.Transfer
有点像Response.Redirect
,因为它允许您加载“不同”的 URL 而不是原始 URL。但是,当 Reponse.Redirect
发起新请求时,Server.Transfer
会将现有请求传输到服务器上的新页面。
关于 Response.Redirect 和 Server.Transfer 之间差异的更好解释可以在 here 中找到。 .
示例
bool showCommentPopup = false;
if (HttpContext.Current.Items["ShowCommentPopup"] != null)
{
showCommentPopup = (bool)HttpContext.Current.Items["ShowCommentPopup"];
}
//...
HttpContext.Current.Items["ShowCommentPopup"] = true;
关于ASP.NET 在重定向和回发之间传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1219109/