我有一个asp.net控件,它似乎在页面刷新时触发按钮单击事件处理程序。为什么会发生这种情况,我怎么能避免呢?
答案 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)用于重新加载页面的事件按钮代码。我认为这可能会导致额外的网络流量,但这很简单。