20

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

我尝试了下面的代码来解决它。实际上,我在 SharePoint 页面中添加了一个可视化 Web 部件。添加 webpart 是一个回发事件,所以 !postback 每次我将 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();
}

我该如何解决这个问题?

4

6 回答 6

9

使用视图状态对我来说效果更好,详见此处。基本上:

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();
}   
于 2013-09-26T21:44:46.977 回答
5

This article could be of help to you http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET

you are adding a Guid to your view state to uniquely identify each page. This mechanism works fine when you are in the Page class itself. If you need to identify requests before you reach the page handler, you need to use a different mechanism (since view state is not yet restored).

The Page.LoadComplete event is a reasonable place to check if a Guid is associated with the page, and if not, create one.

check this http://shawpnendu.blogspot.in/2009/12/how-to-detect-page-refresh-using-aspnet.html

于 2012-08-03T10:10:10.197 回答
1

这对我来说很好..

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();
    } 
}
于 2020-11-30T05:51:06.023 回答
1

简单的解决方案

以为我会发布这个简单的 3 行解决方案,以防它对某人有所帮助。在发布会话和视图状态 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

     }
于 2019-10-04T18:09:30.933 回答
0

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

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

protected void Page_Load(object sender, EventArgs e)
    {
        if ((Boolean)Session["CheckRefresh"] is true)
        {
            Session["CheckRefresh"] = null;
            Response.Write("Page was refreshed");
        }
        else
        { }
    }
    protected void Page_PreInit(object sender, EventArgs e)
    {
        Session["CheckRefresh"] = Session["CheckRefresh"] is null ? false : true;
    }
于 2018-06-11T12:30:30.237 回答
0

如果您想检测 HTTP GET 而不仅仅是 POST 上的刷新,这里有一个 hacky 解决方法,在现代浏览器中,大多数情况下都有效。

Javascript:

window.onload = function () {
    // regex for finding "loaded" query string parameter
    var qsRegex = /^(\?|.+&)loaded=\d/ig;
    if (!qsRegex.test(location.search)) {
        var loc = window.location.href + (window.location.search.length ? '&' : '?') + 'loaded=1';
        window.history.replaceState(null, document.title, loc);
    }
};

C#:

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

当页面加载时,它将更改添加 QueryString 参数loaded=1而不重新加载页面(同样,这window.history.replaceState---仅适用于后古浏览器)。然后,当用户刷新页面时,服务器可以检查loaded查询字符串的参数是否存在。

警告:大多有效

这不起作用的情况是用户单击地址栏并按下enter。也就是说,服务器将产生误报,检测到刷新,当可能性很大时,用户实际上打算重新加载页面。

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

我没有考虑太多,但是可以编写一些魔术来通过地址栏使用任何/全部来区分刷新和重置:

  • SessionState(假设SessionState已启用)和loadedQueryString 参数的值
  • 事件window.onbeforeunload监听器
  • 键盘事件(检测F5Ctrl + R快速将 URL 更改回删除loadedQueryString 参数——尽管这对于单击浏览器的刷新按钮会产生误报)
  • 饼干

如果有人确实提出了解决方案,我很想听听。

于 2015-09-07T19:19:53.993 回答