Introduction
The main aim of this article is to make you know among the several controls that resides in ASP.NET page, at the time of PostBack
how to know which control has actually raised this event.
Background
Technical definition about PostBack: Most ASP.NET Controls are "Server Controls". This means that when an action occurs, the Page, which hosts all its controls inside <FORM
... tags, makes a regular old HTTP POST, with itself being the target URL. This is referred to as a "POSTBACK
". *
In simple words, we can differentiate PostBack
and Redirection in this way.
Postback: It is the scenario in which ASP.NET page redirects to page itself.
Redirect: It is the scenario in which ASP.NET page is called from another page.
You can check whether the page is PostedBack
or not with code side using IsPostBack
Property which returns Bool
.
Using the Code
The agenda of this article is to determine which control inside page has made page to be posted back to itself OR in other words which control has raised PostBack
.
For the control which supports AutoPostBack
property, ASP.NET Page has a inbuilt function which will determine the event raising control.
There are several controls that support AutoPostBack
, among them some are:
Dropdown
CheckBoxList
RadioButtonList
TextBox
, etc.
These controls calls _doPostback
function in JavaScript generated by ASP.NET automatically.
Let's have a look at the _doPostback
function.
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
Note:
- This function will not be visible until minimum of one control is raising the
AutoPostBack
inside page.
- The
_doPostBack
event simply stores value in two hidden fields.
eventTarget
- Name of the control raised the postback
eventArgument
- The argument to be sent to server
Let's have a look at how those two hidden fields are on page.
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
Now if you want to get the ID of a raising control from the code side, you can write this simple snippet and find the values stored in hidden field:
if (IsPostBack)
{
string ControlID = string.Empty;
if (!String.IsNullOrEmpty(Request.Form["__EVENTTARGET"]))
{
ControlID = Request.Form["__EVENTTARGET"];
}
}
OR alternatively, you can find full control object using:
if (IsPostBack)
{
string ControlID = string.Empty;
if (!String.IsNullOrEmpty(Request.Form["__EVENTTARGET"]))
{
ControlID = Page.Request.Params["__EVENTTARGET"];
Control postbackControl = Page.FindControl(ControlID);
}
}
_doPostBack
function only will be called by AutoPostBack
property supportive Controls
now let's have a look of the other Control
which don't support that inbuilt.
Controls that can be listed are:
To make a functionality for Non Supportive AutopostBack
Property Control, make one Hidden field on the page.
<asp:HiddenField ID="CustomHiddenField" runat="server" />
Call a custom Js function on the clientclick
so that it will be stored in hidden field before page actually redirects to server.
<asp:Button ID="btn" runat="server" Text="Click me"
OnClientClick = "SetSource(this.id)" />
function SetSource(SourceID)
{
var hidSourceID =
document.getElementById("<%=CustomHiddenField.ClientID%>");
hidSourceID.value = SourceID;
}
Note: Always use "<%=CustomHiddenField.ClientID%>"
convention because Hiddenfield
ID can be renamed by ASP.NET.
And get a name once page is posted back by server using Codebehind
.
if (IsPostBack)
{
string CtrlID = string.Empty;
if (!String.IsNullOrEmpty(Request.Form[CustomHiddenField.UniqueID]))
{
CtrlID = Request.Form[CustomHiddenField.UniqueID];
}
}
Now below is a full code snippet for getting raising control among both type of controls.
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
string ControlID = string.Empty;
if (!String.IsNullOrEmpty(Request.Form["__EVENTTARGET"]))
{
ControlID = Request.Form["__EVENTTARGET"];
}
else
{
if (!String.IsNullOrEmpty(Request.Form[CustomHiddenField.UniqueID]))
{
ControlID = Request.Form[CustomHiddenField.UniqueID];
}
}
}
}
History
- 14th December, 2010 - Truncated code with
IsNullOrEmpty
- 9th December, 2010 - Attached code and some typos corrected WTHO ThatRaja
- 8th December, 2010 - Article published
Reference