ViewState kavramı dinamik kontroller yaratırken çok önemlidir. Yaratılan dinamik kontrollerin durumlarını ViewState sayesinde koruyabilir, bu kontroller üzerinde işlemler yaparken ViewState’deki datayı kullanabiliriz.
Ancak bu noktada dinamik olarak yarattığımız ve sayfaya eklediğimiz kontrollerin hiyerarşik yapısından emin olmamız lazım.  Nedir bu yapı peki?
Sayfaya eklediğimiz kontroller, belli bir düzene göre o sayfada yer alır. Bu yapıya Control Tree denir. Dinamik yada statik olarak eklediğimiz kontrollerin bu ağaç yapısındaki yerlerinden biz sorumlu oluruz. Controls.Add(Control c) şeklinde bu kontrol ağacına yeni kontroller ekleyebiliriz. ViewState kavramı bu noktada çok önem kazanıyor. Aşağıdaki gibi bir örnekle bunu açıklamaya çalışacağım.
Şimdi bir tane Button olduğunu farzedelim.Buna basınca yeni 2 tane kontrol ekleyelim.

protected void Button1_Click(object sender, EventArgs e)
{
            TextBox mail = new TextBox();
            this.form1.Controls.Add(mail);

            TextBox phone = new TextBox();
            this.form1.Controls.Add(phone);
}

Bir çoğumuz ilk olarak böyle yapıyoruz eminim ki. Button’a tıkladığımızda sayfa postback olur, ASP.NET Page LifeCycle sırayala çalışır ve son olarak bu event çalışır ve ekranda 2 tane textbox görürüz. Buraya kadar her şey çok güzel. Ancak sayfada başka bir postback olduğunda bu kontrollerin kaybolduğunu ya da durumlarının korunmadığını görürüz.
Ve ilk olarak aklımıza ViewState gelir. Ancak ViewState gelmeden önce kontrol ağacını düşünmemiz gerekir. Çünkü ViewState, kontrol ağacındaki kontrollerin durumundan sorumludur. Kontrol ağacının kendisinden sorumlu değildir. Controls.Add() şeklinde kontrol ağacına eklemediğimiz kontrollerin ViewState’lerini korumamak pek mümkün değildir. Bu durumda 2. bir postback olduğunda kontrol ağacında hiç bir kontrol olmadığı için, kontrollerin ViewState’leri de olmaz.