2009-08-02 67 views
2

首先,感谢您的阅读。ASP.NET在重定向和回发之间传递值

我会尽我所能描述我的情况。

我有一个页面,用户可以留言。 这里的评论流程

  • A-1。点击'评论'按钮
  • A-2。使用ajaxtoolkit中的ModalPopupExtender显示带有文本框的模式弹出窗口。
  • A-3。用户在文本框中键入评论,然后单击“确定”。

但是,当用户未登录时,预期的行为会发生变化。

  • B-1。点击'评论'按钮
  • B-2。显示登录模式弹出式窗口,编号为& pwd文本框。
  • B-3。用户类型ID & pwd,然后单击确定。
  • B-4。评论模式弹出显示
  • B-5。用户输入评论并单击确定。

我有处理这种情况的问题。

当B-3发生时,页面被回发,我登录用户,更新会话对象,并且我将Response.Rediect()页面显示给自己以显示正确的登录状态(我必须... )。 重定向后,在Page_Load()中,我需要检查一些值以显示Comment-Modal-Popup。 但我不知道如何..

这里就是我认为

  • 的ViewState
    • 我只是不能使用它,因为页面被重定向没有调回。
  • 查询字符串
    • 我可以重定向时添加 “showCommentPopup = 1” 的网址,但会留下不必要的查询字符串URL中。我不希望用户滥用它。
  • 会议
    • 我实际使用Session对象。在重定向之前,我将Session [“ShowCommentPopup”]设置为true。在Page_Load()中,如果它已设置,我将其删除并显示弹出窗口。

使用会话像我一样不正确,当用户打开同一个页面中的多个标签的工作。

  1. 用户打开两个选项卡(在Firefox)与相同的URL
  2. 用户跟随在第一凸片从B-1至B-3步骤。
  3. 在页面被重定向到B-3和B-4之前,用户刷新第二个选项卡。
  4. 如果时机正确,则在第二个选项卡中显示注释弹出窗口。

我希望听到来自计算器有着深刻的见解..

+0

为什么你*有*重定向到处理登录?通常情况下,如果您已经提示输入姓名和密码,则无需重定向即可。 – Thorarin 2009-08-02 16:12:39

+0

你是对的,我可以在不重定向的情况下处理登录。它显示正确的登录状态,我不能这样做..该页面使用黑盒控件来显示登录状态,并且它只显示页面重定向后正确的登录状态..... – wooohoh 2009-08-02 16:43:04

回答

3

如果您存储ShowCommentPopup标志HttpContext.Items集合中,而不是在会话,然后我还没有试过,但我认为,使用Server.Transfer而不是Response.Redirect你应该能够达到预期的结果。

HttpContext.Items是一个字典,可以用来存储数据的生命周期是请求的生命周期。这意味着来自不同选项卡或窗口的第二个请求将具有不同的HttpContext.Items字典。

Server.Transfer有点像在Response.Redirect它允许你加载一个“与众不同”的网址,而不是原来的。但是,当Reponse.Redirect发起新请求时,Server.Transfer将现有请求传输到服务器上的新页面。

Response.RedirectServer.Transfer之间的差异的更好的解释可以发现here


bool showCommentPopup = false; 
if (HttpContext.Current.Items["ShowCommentPopup"] != null) 
{ 
    showCommentPopup = (bool)HttpContext.Current.Items["ShowCommentPopup"]; 
} 

//... 

HttpContext.Current.Items["ShowCommentPopup"] = true; 
0

你已经清楚地认为通过您的解决方案!我猜测Session的问题在于,他们可以在与他们登录的页面不同的页面上发表评论。你可以解决这个问题通过存储会话变种,而不是一个布尔值,但随着页显示它:

var uniqueString = this.ToString() + uniquePageID; 
if (Session["ShowCommentPage"].ToString() == uniqueString) 
    //show modal & remove session var 

现在你的程序只“休息”当用户访问同一个对象在两个不同的窗口,在Window#1上登录,并在Window#2上刷新。而且,它们并没有真正突破,因为他们以任何一种方式结束对同一个对象的评论。

我使用uniquePageID的原因是因为我想你有一个模板页面(“showObject.aspx”),其参数要显示(“showObject.aspx?objectID = 3”)。为了确保评论留在同一个ID,它需要存在于uniqueString

+0

是这种方法的工作原理用户不会在错误的页面上留言。仍然可以在#2窗口中显示弹出窗口,而不是在触发整个事件的窗口#1中显示。我认为这是用户体验中的一个问题。最好,我希望我也能解决这个问题。 – wooohoh 2009-08-02 16:53:01