我有一个索引页面,可以将用户发送到不同浏览器标签上的编辑产品页面。
对于编辑的每个产品,索引都会重写Session [“ProductID”]。
然后,编辑页面具有以下代码,以便为此选项卡和产品提供唯一标识符:
if (!IsPostBack) //first time page load
{
Random R = new Random(DateTime.Now.Millisecond + DateTime.Now.Second * 1000 + DateTime.Now.Minute * 60000 + DateTime.Now.Minute * 3600000);
PageID.Value = R.Next().ToString();
Session[PageID.Value + "ProductID"] = Session["ProductID"];
}
这是有效的,当同一个用户打开多个标签时,我只在我的代码中引用Session [PageID.Value +“ProductID”],这样我总是拥有正确的ID。 (我在一个受信任的环境中工作,这是用于内部网,因此我对安全级别不太感兴趣)。
如果用户通过按F5键进行页面刷新,则会出现此问题。此时Session [PageID.Value +“ProductID”]获取他打开的最后一个产品的Session [“ProductID”]。
例如:
用户1在tab1中打开product1
用户1在tab2中打开product2
每当他们正常使用该工具时,一切正常。但是如果:
产品1页面上的用户1点击刷新按钮(F5),product1页面变为product2页面
有没有办法从“从另一个页面首次加载/重定向”检测页面刷新,以便我可以告诉我的页面不要更新我的Session [PageID.Value +“ProductID”]?
答案 0 :(得分:4)
就个人而言,我会选择URL参数。例如。将产品ID作为URL参数传递。
如果你需要没有参数的页面,你可以这样。
这样你就可以在第一次调用(=参数存在)和第二次调用(参数不存在)之间进行操作。
答案 1 :(得分:2)
您可能需要查看this。我认为它接近你正在寻找的东西。
答案 2 :(得分:2)
我通过存储两个版本的状态识别参数解决了一个非常类似的问题:一个在Session中,另一个在ViewState或URL(QueryString)中。
如果比较Page_Load上的两个值,则会告诉您自首次加载页面以来会话变量是否已更改。这应该就是你所需要的。
编辑:代码的粗略草图(警告 - 自从我3年前编写以来没有看到实际的代码):
protected string currentProductID
{
get
{
return Request.QueryString["ProductID"];
//or:
//return (string)ViewState["ProductID"];
//or:
//return HiddenField1.Value;
}
set
{
Response.Redirect(ResolveUrl("~/MyPage.aspx?ProductID=" + value));
//or:
//ViewState.Add("ProductID", value);
//or:
//HiddenField1.Value = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
//If the problem only occurs when not posting back, wrap the below in
// an if(!IsPostBack) block. My past issue occurred on both postbacks
// and page refreshes.
//Note: I'm assuming Session["ProductID"] should never be null.
if (currentProductID == null)
{
//Loading page for the first time.
currentProductID = (string)Session["ProductID"];
}
else if (currentProductID != Session["ProductID"])
{
//ProductID has changed since the page was first loaded, so react accordingly.
//You can use the original ProductID from the first load, or reset it to match the one in the Session.
//If you use the earlier one, you may or may not want to reset the one in Session to match.
}
}
在上面的代码中,请注意对ViewState的更改(包括隐藏控件的值)仅对下一个PostBack生效。刷新后,它们将恢复到最近的值。在我的情况下,这就是我想要的,但听起来它不适合你的情况。不过,根据您的实施方式,这些信息可能对您有用。
我遗漏了关于将currentProductID
与Session[PageID.Value + "ProductID"]
进行比较的讨论,因为我已经发布了很多代码,而且我不知道你要尝试的细节做。但是,有多种方法可以使用Session,ViewState和QueryString来收集有关页面状态和历史的信息。
希望这应该给你一般的想法。如果这还不足以让你离开,请告诉我。