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

4
我有一个asp.net控件,在页面刷新时似乎会触发按钮单击事件处理程序。这是为什么,我该如何避免?

你的意思是你有一个带有ASP:Button的页面,你已经点击了一次按钮使页面进行了后台提交。然后在每次按F5或刷新时,“Click”事件都会发生? - Nick Bork
不确定关于 postback 部分,该按钮仅执行一些逻辑,然后写入响应流。但是在代码完成后,如果我在浏览器中手动刷新页面。 - GurdeepS
5个回答

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());  
    }

see This for more details


1
这对我非常有效。只需要添加 base.OnPreRender(e); 即可。 - scubasteve623

2
这是一个关于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
    }

}

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

1

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接