
Mellékelt példa megnyitása előtt szükséges egy ControlPostBack nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
Az alkalmazás futtatása előtt ControlPostBackLibrary mappában található kontrolt fel kell venni a ToolBox-ba. Ennek módja a Saját kontrol létrehozása című szakaszban olvasható.
A megoldást a Page osztály két metódusa hordozza, melyek azon túl, hogy generálnak egy kliens-oldali script-et, még arra is képesek, hogy velük információkat juttassunk el a szerverhez paraméterek formájában, melyeket a szerver tetszőlegesen felhasználhat utasításainknak megfelelően.
A műveletvégzés alapjai az úgynevezett ECMAScript szabványig nyúlnak vissza (Javascript, JScript), mely különleges eseménykezelő mechanizmusával segíti az ASP.NET alkalmazásokat.
A két metódus a GetPostBackEventReference és a GetPostBackClientHyperlink, melyek csak kismértékben térnek el egymástól. A mellékelt példában az előbbit használtuk, de a cikk későbbi szakaszában közöljük a kódban eszközölendő változtatást a másik metódus használatához.
Lássuk először a GetPostBackEventReference metódust:
A metódusnak két változata van, melyek csak abban különböznek, hogy van-e második paraméter, vagy nincs.

GetPostBackEventReference
Osztály: Page
public string GetPostBackEventReference(
Control control,
string argument
);
Generál egy kliens-oldali script-tet, mely megvalósítja az üzenetküldést.
Paraméterek
Control control
A szerver-kontrol, melyhez szerver-oldali eseményt szeretnénk deklarálni (PostBack).
string argument
Az átadott paraméter.
Visszatérési érték
Annak a kliens-oldali függvénynek a referenciája, mely megvalósítja az üzenetküldést.
A következőkben a GetPostBackClientHyperlink metódust vizsgáljuk meg, közölve a hajszálnyi eltérést:

GetPostBackClientHyperlink
Osztály: Page
public string GetPostBackClientHyperlink(
Control control,
string argument
);
Generál egy kliens-oldali script-et, mely megvalósítja az üzenetküldést. A különbség – a példában erre kitérünk – hogy a függvény referenciát úgy adja meg, hogy a név elé tesz ’javascript:’ előtagot, így a hagyományos függvénydeklarációban ez elhagyható.
Paraméterek
Control control
A szerver-kontrol, melyhez szerver-oldali eseményt szeretnénk deklarálni (PostBack).
string argument
Az átadott paraméter, mely hasznos információkat hordozhat.
Visszatérési érték
Annak a kliens-oldali függvénynek a referenciája a ’javascript:’ előtaggal, mely megvalósítja az üzenetküldést.
Saját kontrol létrehozása
A cikknek ebben a szakaszában elkészítjük azt a saját szerver-kontrolt, mely igényli majd a szerver PostBack-et. A fejezetben közöljük azt a változtatást, melyet meg kell tenni a deklarációban ahhoz, hogy a művelet sikeres legyen.
Az elkészítendő kontrol képes lesz hagyományos linkként viselkedni, vagyis egy megadott URL-re navigálni a felhasználót, amennyiben az a böngészőjében a linkre kattint.
A kontrol osztályában deklarálnunk kell egy nyilvános változót, mely a klikk eseményt reprezentálja:
[ToolboxData("<{0}:ControlPostBackControl runat=server></{0}:ControlPostBackControl>")]
public class ControlPostBackControl : Control, IPostBackEventHandler
{
public event EventHandler Click;
Felül kell írnunk az osztály OnClick metódusát:
protected virtual void OnClick(EventArgs e)
{
if (Click != null)
{
Click(this, e);
}
}
Gondoskodunk arról, hogy a kontrolra klikkelve a szerver-oldalon a megfelelő eseménykezelő fusson, amennyiben a kérés eljut a szerverig:
public void RaisePostBackEvent(string eventArgument)
{
OnClick(new EventArgs());
}
Végül meg kell tennünk a változtatást a HTML kód generálását végző metódusban:
protected override void Render(HtmlTextWriter output)
{
output.Write("<a id =\"" + this.UniqueID + "\" href= \"javascript: " + Page.GetPostBackEventReference(this,"WebForm2.aspx") + "\">");
output.Write(" " + this.UniqueID + "</a>");
}
A GetPostBackClientHyperlink metódust használva a ’javascript’ előtag automatikusan megjelenik a hivatkozásban, így az elhagyható. A kód a következő lenne:
protected override void Render(HtmlTextWriter output)
{
output.Write("<a id =\"" + this.UniqueID + "\" href= \" Page. GetPostBackClientHyperlink (this,"WebForm2.aspx") + "\">");
output.Write(" " + this.UniqueID + "</a>");
}
A kliens-oldali HTML kód meglehetősen érdekesen változott. A szerver-oldali kontrolunk a következőképpen jelenik meg a kliens-oldalon:
<a id ="Link" href= "javascript: __doPostBack('Link','WebForm2.aspx')"> Link</a>
A hivatkozás egy ’javascript:__doPostBack’ nevű függvény, mely paramétereként megkapja a kontrol nevét, valamint egy .aspx oldal-nevet, amire navigálhat a felhasználó.
A javascript függvény a következőképpen fest:
<script language="javascript">
<!--
function __doPostBack(eventTarget, eventArgument)
{
var theform = document.Form1;
theform.__EVENTTARGET.value = eventTarget;
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
</script>
Látható, hogy a két paraméter egy-egy hidden INPUT mezőben tárolódik, majd ezek értéke jut el POST metódussal a szerverhez:
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
Felhasználása előtt a kontrolt fel kell tenni a ToolBox-ra a szokásos módon: kattintsunk a ToolBox valamely lapján az egér jobb gombjával, majd a megjelenő menüből válasszuk ki a Customize ToolBox pontot, a megjelenő ablakban a .NET Frameworks Components fület. A Browse gombbal keressük elő az imént létrehozott .DLL-t.
A kontrolt felhasználó ASP.NET alkalmazás
Az alkalmazás főlapjára (WebForm1.aspx) feltéve a kontrolt, egy apró kiegészítést kell tennünk a kódban. Meg kell adnunk egy szerver-oldali eseménykezelőt a klikk eseményhez, ugyanis a kérés beérkezett, de még semmi nem történik:
<cc1:ControlPostBackControl id="Link" runat="server" OnClick="Button_Click"></cc1:ControlPostBackControl>
Meg kell valósítani a kezelő kódját, amely kiveszi a paramétert a Form hidden INPUT vezérlőjéből, majd ez alapján végrehajtja a WebForm2.aspx lap betöltését:
public void Button_Click(object sender, EventArgs e)
{
Response.Redirect(Page.Request.Form["__EVENTARGUMENT"]);
}