页面刷新与IsPostBack

时间:2011-01-25 20:21:05

标签: c# .net asp.net

我有一个索引页面,可以将用户发送到不同浏览器标签上的编辑产品页面。

对于编辑的每个产品,索引都会重写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”]?

3 个答案:

答案 0 :(得分:4)

就个人而言,我会选择URL参数。例如。将产品ID作为URL参数传递。

如果你需要没有参数的页面,你可以这样。

  1. 将参数传递给页面。
  2. 如果存在参数,页面将重新加载并删除参数
  3. 这样你就可以在第一次调用(=参数存在)和第二次调用(参数不存在)之间进行操作。

答案 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生效。刷新后,它们将恢复到最近的值。在我的情况下,这就是我想要的,但听起来它不适合你的情况。不过,根据您的实施方式,这些信息可能对您有用。

我遗漏了关于将currentProductIDSession[PageID.Value + "ProductID"]进行比较的讨论,因为我已经发布了很多代码,而且我不知道你要尝试的细节做。但是,有多种方法可以使用Session,ViewState和QueryString来收集有关页面状态和历史的信息。

希望这应该给你一般的想法。如果这还不足以让你离开,请告诉我。