HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Időzített PostBack ASP.NET alkalmazásokban


Példaprogram letöltése

13946 bájt

Web-alkalmazásainkban előfordulhat olyan eset, amikor felhasználói beavatkozás nélkül kell eljuttatni egy kérést bizonyos időközönként a szerverhez. Ekkor valamilyen módon időzítenünk kell ezt a PostBack eseményt. A .NET erre is kínál megoldást időzítő osztálya révén. Cikkünkben bemutatunk két lehetséges alternatívát arra, hogyan lehet bizonyos időközönként újratöltődésre bírni Weblapunkat a Timer osztály nélkül.

Mellékelt példa megnyitása előtt szükséges egy PostBackTimer 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.
A megoldások egyikében egyszerűen egy <META> elemet helyezünk el a weboldalunk HTML-kódjában, ott is a <HEAD> szegmensen belül. A tagnak két attribútumát kell beállítani: a ’http-equiv’ attribútumban megadjuk, hogy milyen műveletet kell elvégezni, a ’content’ attribútumban pedig, hogy milyen időközönként. A beillesztett sor:
...
<HEAD>
  <META http-equiv="refresh" content="5">
  ...
</HEAD>
Látható, hogy a művelet a ’refresh’ szócskával van azonosítva, mely a HTTP-fejlécmezők egyike. A második attribútumban másodpercben megadjuk az ismétlődési sűrűséget.
Timer kontrol
A másik megoldásban készítünk egy Webes kontrolt, mely hasonlít a .NET Timer komponensére, azonban valamivel egyszerűbben használható.
A kontrolhoz deklarált Designer osztályban adtuk meg, hogyan nézzen ki kontrolunk szerkesztési időben.
A kontrol létrehozásához a következőket kell tennünk: először is a kontrolt a Control osztályból származtatjuk, valamint implementálnunk kell a IPostBackEventHandler interfész tulajdonságait is.
[Designer(typeof(Designer))]
public class PostBackTimerControl : Control, IPostBackEventHandler
{
Deklarálunk három változót, melyeket a property-ken keresztül állíthatunk. Ezekkel engedélyezzük a kontrolunkat, valamint megadhatjuk az intervallumot:
  private int interval = 1000;
  private bool enabled = true;
  private bool enableViewState = true; 
A változókat állító property-k pedig:
  public int Interval
  {
    get
    {
      return interval;
    }
    set
    {
      interval = value;
    }
  }
Az engedélyezésekhez:
  public bool Enabled
  {
    get
    {
      return enabled;
    }
    set
    {
      enabled = value;
    }
  }
  public override bool EnableViewState
  {
    get
    {
      return enableViewState;
    }
    set
    {
      enableViewState = value;
    }
  }
Megadunk egy eseményt a kontrolhoz:
  public event EventHandler Do;
Megadjuk, hogy amikor a kérés a szerverhez ér, a deklarált esemény következzen be:
  public  void RaisePostBackEvent(string eventArgument)
  {
    OnDo(new EventArgs());
  }
Készítünk egy alapértelmezett kezelőt az eseményhez:
  public void OnDo(EventArgs ea)
  {
    if (Do != null)
    {
      Do(this, ea);
    }
  }
A kontrol „megjelenítésekor” egy JavaScript-et helyezünk el a lapon, mely meghívja a window objektum setTimeout mtódusát.
  protected override void Render(HtmlTextWriter output)
  {
    if (enabled)
    {
      StringBuilder sb = new StringBuilder();
      sb.Append("\n<script language=\"javascript\">\n");
      sb.Append("    setTimeout(\"");
sb.Append(base.Page.GetPostBackEventReference(this));
      sb.Append("\", ");
      sb.Append(interval.ToString());
      sb.Append(");\n</script>");
      output.Write(sb.ToString());
    }
  }
}
A setTimeout metódus paraméterében kell megadni, hogy milyen metódust kell végrehajtani a második paraméter értékének megfelelő időközönként. A meghívandó metódus a Page osztály GetPostBackEventReference függvényének visszatérési értéke, a __doPostBack('PostBackTimerControl1',''), mely megvalósítja a PostBack eseményt. A GetPostBackEventReference által generált kód:
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
<script language="javascript">
<!--
  function __doPostBack(eventTarget, eventArgument) {
    var theform = document.Form1;
    theform.__EVENTTARGET.value = eventTarget;
    theform.__EVENTARGUMENT.value = eventArgument;
    theform.submit();
  }
// -->
</script>
A window objektum setTimeout függvénye a következőképpen jelenik meg az oldalon, a kontrol Render metódusa jóvoltából:
<script language="javascript">
  setTimeout("__doPostBack('PostBackTimerControl1','')", 1000);
</script>
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.
Tesztalkalmazás
A tesztalkalmazásban a WebForm-ra felhelyezve a kontrolt, az rögtön használható, hiszen rendelkezik alapértelmezett értékkel. A programban csupán meg kell írnunk a kontrol Do eseményének kezelőjét. Először deklaráljuk:
this.PostBackTimerControl1.Do += new System.EventHandler(this.PostBackTimerControl1_Do);
Majd megírjuk, megvalósítva benne, hogy másodpercenkénti számláló indulhasson el minden egyes letöltéskor. A számláló értékeit az Application objektumba menti, majd újratöltődve abból veszi ki, és növeli meg eggyel:
if(Application["PBT"] == null)
{
  Application["PBT"] = 0;
}
string strResult = "Számláló: " + Application["PBT"].ToString();
Application["PBT"] = (int)Application["PBT"] + 1; Response.Write("<font size=6 color=red>" + strResult + "</font>");
A System.Timers névtér Timer komponensétől csak annyiban tér el kontrolunk, hogy tevékenységét egy metódus végrehajtására korlátoztuk – vagyis a PostBack-t végrehajtó metódus végrehajtására - , azonban a célnak tökéletesen megfelel, használata egyszerű.

Cikksorozat

#IDKategóriaCikk címeSorozat
1621DelphiMySQL szerverek elérése Delphi-ből1. rész
1632DelphiMySQL szerverek elérése Delphi-ből2. rész
1641DelphiMySQL szerverek elérése Delphi-ből3. rész
1649DelphiMySQL szerverek elérése Delphi-ből4. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 26. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |