IsPostBack

MSDN spune ca proprietatea IsPostBack e o valoare care indica daca pagina este creata pentru a fi raspunsul postbackului unui client sau pagina este creata si accesata pentru prima data.

Cuvantul cheie e postback, de fapt ce inseamna acest postback. Perceptia generala e ca IsPostBack e true atunci cand utilizatorul da click pe un buton sau pe un control dintr-o anumita pagina, care are setata proprietatea AutoPostBack = true (dropdown de exemplu).. sau hai sa zicem pe orice control cu evenimente care se instantiaza pe server in urma unei actiuni a utilizatorului in fereastra browserului.

Mai altfel zis, Popescu, avid de monden, deschide browseru, scrie http://www.web.com/Clasamente.aspx, ii apare pagina frumoasa, care il invita sa dea click pentru a vedea clasamentul celor mai naspa vedete din Romania. Developerul presupune la PageLoad ca Page.IsPostBack e true, adica Popescu sigur avea deja pagina incarcata in browser, inainte de a accesa clasamentul celor mai naspa vedete din Romania.

Scenariul e de fapt ca browserul lui Popescu face o cerere GET (IsPostBack = false), serverul ii trimite browserului lui Popescu un HTML generat de ASP .Net, gecko sau trident sau care o fi raspunzator, se apuca de desenat chestii din HTML, apoi browserul lui Popescu e instruit sa faca o cerere POST(IsPostBack = true), pentru ca Popescu a dat click pe butonul care ii spunea lui ca daca da click acolo va vedea clasamentul celor mai naspa vedete din Romania. Clasamentul se formeaza in urma unor voturi, dar nu sta nimeni sa le numere, deci sigur tre sa se treaca prin ASP .Net, sa se ocupe el de calcule.

Developerul presupune ca Popescu nu poate ajunge la clasament decat daca a intrat pe pagina http://www.web.com/Clasamente.aspx, mai ales ca el, developerul, nu ii ofera nici un link de genul http://www.web.com/Clasamente/CeleMaiNaspaVedeteDinRO.aspx. Developerul e foarte convins ca la momentul cererii clasamentului, Popescu sigur a facut anterior o cerere la http://www.web.com/Clasamente.aspx.

Nu prea e asa. Popescu poate sa ajunga la clasament, chiar daca nu are acces la URLul clasamentului, iar developerul a presupus gresit. Popescu poate folosi un tool de gen Fiddler , pentru a crea o cerere POST sau, daca stie putin HTML, isi creeaza un fisier care sa contina un form cu anumite inputuri. Browserul lui va crea o cerere POST similara cu cea reala din punct de vedere al continutului specific cererii POST, unde se afla parametrii si valorile lor. Singurul lucru la care trebuie sa fie atent Popescu e sa includa si parametrul __VIEWSTATE, corespunzator paginii. Mai mult, Smith din Texas, stiind valoarea lui __VIEWSTATE, poate construi aceeasi cerere ca a lui Popescu.

Diverse valori ale lui IsPostBack, pentru situatii confuze:

1. se face un GET la http://www.web.com/Clasamente.aspx, pagina va contine un <a href="/Clasamente.aspx">Clasamente</a> si userul urmareste linkul.

    Se cam incadreaza in ceea ce a zis MSDN, adica am dat un click intr-o pagina si am primit aceeasi pagina si IsPostBack ar trebuie sa fie true. De fapt, urmarind linkul, s-a creat o cerere GET, deci IsPostBack va fi false.
2. Se creeaza un fisier HTML care sa contina ceva de genul
<form method="post" action="http://www.web.com/Clasamente.aspx" id="form1">
<input type="hidden"
name="__VIEWSTATE"
id="__VIEWSTATE"
value="/wEPDwUJNzgzNDMwNTMzZGSzEhAHmN2wh/fD7Vy8+yI92wZpSw=="/>
</form>
<script>
document.getElementById("form1").submit();
</script>

Intr-adevar aici pagina nu a fost creata pentru prima data. Pentru a obtine valoarea lui __VIEWSTATE, ar fi trebuit sa creez mai intai o cerere GET. IsPostBack va fi true, pentru ca browserul va creea o cerere POST si va include si parametrul __VIEWSTATE.

Dar daca cineva imi va trimite acest fisier HTML, ce poate fi comparat cu un shortcut in Windows, senzatia ca eu as fi facut PostBack e cam falsa. Tehnic e postback.

Sa urmam sfatul ca ViewState nu trebuie sa contina nici un fel de informatie legata de securitate, iar ceea ce se face in urmatorul test, la fel, nimic legat de securitate


if (!Page.IsPostBack)
{

}
else
{

}

Comments

  1. Concluzia mea despre valoarea IsPortBack'ului era ca pot sa aflu daca trebuie sa intializez unele controale sau pot sa le reconsruiesc din valorile sesiunii existente (mai ales pentru controale createdinamic: HOW TO: Dynamically Create Controls in ASP.NET by Using Visual C# .NET).
    Ca sa fii mai sigur cum a fost ceruta pagina vezi:
    How to: Determine How ASP.NET Web Pages Were Invoked

    ReplyDelete
  2. de exemplu pentru controalele bindabile datasource-ul e luat singura data, atunci cand nu e post back, adica
    if (!IsPostBack)
    {
    ddl.DataSource = ..;
    ddl.DataBind();
    }

    iar la post back controlul e reconstruit din state-ul controlului (suita SaveViewState, LoadViewState)
    LoadViewState oricum e apelat la PostBack si IsPostBack e true

    ReplyDelete

Post a Comment

Popular posts from this blog

IIS 7.5, HTTPS Bindings and ERR_CONNECTION_RESET

Table Per Hierarchy Inheritance with Column Discriminator and Associations used in Derived Entity Types

The <link> saga on ASP .Net