Friday, February 29, 2008

Handling page refresh (F5) in ASP.NET post backs

Handling page refresh (F5) on post backs is one of the biggest problem for many web applications.Usually we used the simplest solution by redirecting to the same page after the action, but not always usefull.

In the previous post we saw how to handle a multiple user clicks on the same button.
but still user can overdo things by page refresh (F5).

I use a header user control in all my applications which I found is the best place to handle this. The theory is F5 will post a older viewstate so if we have anything to compare we can skip the action from being perfomed once again.

The below code in .NET2.0 goes well with IE.
Insert it in your page or some common header/banner control


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session["PostID"] = "1001";
ViewState["PostID"] = Session["PostID"].ToString();
}
}

public bool IsValidPost()
{
if (ViewState["PostID"].ToString()
== Session["PostID"].ToString())
{
Session["PostID"] =
(Convert.ToInt16(Session["PostID"]) + 1).ToString();

ViewState["PostID"] = Session["PostID"].ToString();

return true;
}
else
{
ViewState["PostID"] =
Session["PostID"].ToString();

return false;
}

}



Now in your button click verify if the postback is real button click


public void ActionEvent(object sender, CommandEventArgs e)
{
if (IsValidPost())
{
DoPocessing();
}
}

How to avoid multiple button clicks while post back in ASP.NET

Many time we face the issue how to prevent user from clicking the same button before completing the post back.

A simple java script can be added for this. this will change the text of button and verify. A Dot Net 2.0 example given below


< asp:Button ID="btnAction" runat="server"
OnCommand="ActionEvent"
OnClientClick="
{
var res=this.value=='Processing...'?false:true;
this.value='Processing...';
return res;
}"
Text="Do Action" Width="125px" />

The text of button is changed to 'Processing...' so that the user even knoWS something is going on and even if he clicks it will not post back as our client script returns false if the caption is 'Processing...'.