如何在.net中检测页面刷新

时间:2012-08-03 10:07:06

标签: c# asp.net sharepoint page-lifecycle sharepoint-object-model

我有一个Button_click事件。刷新页面时,之前的Postback事件再次触发。如何识别页面刷新事件以阻止Postback操作?

我尝试了下面的代码来解决它。实际上,我在SharePoint页面中添加了一个可视webpart。添加webpart是一个回发事件所以!每次我将webpart添加到页面时回发总是假的,并且我在else循环中收到错误,因为对象引用是null

if (!IsPostBack){
    ViewState["postids"] = System.Guid.NewGuid().ToString();
    Cache["postid"] = ViewState["postids"].ToString();
}
else{
    if (ViewState["postids"].ToString() != Cache["postid"].ToString()){
        IsPageRefresh = true;
    }
    Cache["postid"] = System.Guid.NewGuid().ToString();
    ViewState["postids"] = Cache["postid"].ToString();
}

如何解决这个问题?

6 个答案:

答案 0 :(得分:10)

使用viewstate对我来说效果更好,详见here。基本上是:

bool IsPageRefresh = false;

//this section of code checks if the page postback is due to genuine submit by user or by pressing "refresh"
if (!IsPostBack)     
{
    ViewState["ViewStateId"] = System.Guid.NewGuid().ToString();
    Session["SessionId"] = ViewState["ViewStateId"].ToString();
}
else
{
    if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString())
    {
        IsPageRefresh = true;
    }

    Session["SessionId"] = System.Guid.NewGuid().ToString();
    ViewState["ViewStateId"] = Session["SessionId"].ToString();
}   

答案 1 :(得分:5)

这篇文章对您有所帮助 http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET

您正在向视图状态添加Guid以唯一标识每个页面。当您在Page类本身时,此机制可以正常工作。如果需要在到达页面处理程序之前识别请求,则需要使用不同的机制(因为视图状态尚未恢复)。

Page.LoadComplete事件是检查Guid是否与页面关联的合理位置,如果没有,则创建一个。

检查一下 http://shawpnendu.blogspot.in/2009/12/how-to-detect-page-refresh-using-aspnet.html

答案 2 :(得分:0)

如果你想在HTTP GET上检测刷新,而不是仅检测POST,那么在现代浏览器中,这是一个很糟糕的解决办法,大部分都可以使用。

使用Javascript:

public bool IsPageRefresh 
{
    get
    {
        return !string.IsNullOrEmpty(Request.QueryString["loaded"]);
    }
}

C#:

loaded=1

当页面加载时,它会更改添加window.history.replaceState的QueryString参数而不重新加载页面(再次,这个 - loaded - 仅适用于post-archaic browsers)。然后,当用户刷新页面时,服务器可以检查查询字符串的SessionState参数是否存在。

警告:主要是工作

这不起作用的情况是当用户单击地址栏并按输入时。也就是说,服务器会产生误报,检测到刷新,当赔率是,用户实际上是要重新加载页面。

根据您的目的,这可能是可取的,但作为用户,如果我希望它重置页面,它会让我发疯。

我没有过多考虑,但可能可以编写一些魔法,以便通过地址栏使用any / all:<区分刷新和重置/ p>

  • SessionState(假设已启用loaded)和window.onbeforeunload QueryString参数的值
  • loaded事件监听器
  • 键盘事件(检测 F5 Ctrl + R 以快速将URL更改为删除{{1}} QueryString参数 - 尽管这会有误 - 点击浏览器刷新按钮的负面情况)
  • 饼干

如果有人提出解决方案,我很乐意听到。

答案 3 :(得分:0)

检查页面刷新的另一种方法。我编写了没有java脚本或任何客户端的自定义代码。

不确定,这是最好的方式,但我感觉很好。

if($_GET["action"] == 1){
        $action = "_GET";
    }else{
        $action = "_POST";
}
...
${$action["lang_id"]}

答案 4 :(得分:0)

简单解决方案

我认为我会发布这个简单的3行解决方案,以防它对某人有所帮助。发布后,会话和viewstate的IsPageRefresh值将相等,但是在页面刷新时它们将不同步。然后触发重定向以重置页面。如果要保留查询字符串参数,则需要稍微修改重定向。

    protected void Page_Load(object sender, EventArgs e)
    {
        var id = "IsPageRefresh";
        if (IsPostBack && (Guid)ViewState[id] != (Guid)Session[id]) Response.Redirect(HttpContext.Current.Request.Url.AbsolutePath);
        Session[id] = ViewState[id] = Guid.NewGuid();

        // do something

     }

答案 5 :(得分:0)

这对我来说很好。

bool isPageRefreshed = false;

protected void Page_Load(object sender, EventArgs args)
{
    if (!IsPostBack)
    {
        ViewState["ViewStateId"] = System.Guid.NewGuid().ToString();
        Session["SessionId"] = ViewState["ViewStateId"].ToString();
    }
    else
    {
        if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString())
        {
            isPageRefreshed = true;
        }

        Session["SessionId"] = System.Guid.NewGuid().ToString();
        ViewState["ViewStateId"] = Session["SessionId"].ToString();
    } 
}