在页面刷新时触发按钮单击事件处理程序

时间:2012-03-04 15:24:14

标签: asp.net

我有一个asp.net控件,它似乎在页面刷新时触发按钮单击事件处理程序。为什么会发生这种情况,我怎么能避免呢?

5 个答案:

答案 0 :(得分:3)

另一种方法,这对我有用 -

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            Session["update"] = Server.UrlEncode(System.DateTime.Now.ToString());
    }

    protected override void OnPreRender(EventArgs e)
    {
        ViewState["update"] = Session["update"];
    }

    protected void btnProceed_Click(object sender, EventArgs e)
    {           
        if (Session["update"].ToString() == ViewState["update"].ToString())
            DisplayInfo();
    }

    private void DisplayInfo()
    {
        // Do what ever thing you want to do
        Session["update"] = Server.UrlEncode(System.DateTime.Now.ToString());  
    }

有关详细信息,请参阅This

答案 1 :(得分:1)

  

原因是您刷新了发送到服务器的最后信息。哪个是__doPostback中的按钮点击信息。这就是为什么你再次看到按钮发生的事件。

这是一个article,讨论如何通过回发检测刷新。

为了您的快速参考,此信息是从Why in ASP.NET is a button click event executes when page is refreshed?

复制粘贴的

答案 2 :(得分:1)

这是C#解决方案,可停止在页面刷新时触发的点击事件处理程序:

//Web browser refresh fires the last event (ex. button click) again. 
//the following code prevents this action by detecting the Page refresh.

if (!IsPostBack)
{
    ViewState["postGuids"] = System.Guid.NewGuid().ToString();
    Session["postGuid"] = ViewState["postGuids"].ToString();
}
else
{
    if (ViewState["postGuids"].ToString() != Session["postGuid"].ToString())
    {
        IsPageRefresh = true;
    }
    Session["postGuid"] = System.Guid.NewGuid().ToString();
    ViewState["postGuids"] = Session["postGuid"].ToString();
}

protected void Button_Click(object sender, EventArgs e)
{
    if (!IsPageRefresh) //only perform the button click actions if page has not been refreshed
    { 
        //Normal actions as per button click
    }

}

答案 3 :(得分:0)

这就是浏览器的工作方式。 在按F5时,页面刷新会使最后一次调用的服务器端事件再次进入GET / POST。在这种情况下,它是按钮单击事件。 防止这种情况发生的一种方法是在事件逻辑之后使用Response.Redirect(“same_page”)到同一页面。这将强制页面重新加载,此后进行任何进一步的页面刷新将不会调用按钮单击事件。

答案 4 :(得分:0)

我不确定像上面这样的任何服务器代码如何处理检测重复刷新,如果用户看到意外情况,他们可能会这样做。我已经尝试过这种方法,在浪费了一个小时左右之后,决定避免这种情况的最简单方法是在结束时使用 Response.Redirect(HttpContext.Current.Request.Url.ToString(), True)用于重新加载页面的事件按钮代码。我认为这可能会导致额外的网络流量,但这很简单。