ASP.NET WebForms VIEWSTATE


17 Nisan 2012     Etiketler: ASP.NET

ASP.NET'e özgü bir kavram olan ve "durum takibi" için kullanılan VIEWSTATE kavramı nedir, getirileri ve dezavantajları nelerdir?


ASP.NET WebForms sayfa üzerine yerleştirilen kontrollerin tuttuğu değerleri “geri-gönderme” (postback) sonrasında da bu kontrollere yerleştirebilmek için, bütün bu değerleri kripto edilmiş bir şekilde “__VİEWSTATE” adlı gizli bir HTML kontrolünde tutar.


...













Ve bu sayfanın arkasındaki kod da aşağıdaki gibi olsun:

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack ==false)
{ //bu kod sadece sayfa ilk yüklendiginde calisacak
DataTable dataTable = new DataTable();

dataTable.Columns.AddRange(
new DataColumn[] {
new DataColumn("ID", typeof(int)),
new DataColumn("Ad", typeof(string))
}
);

DataRow dataRow = dataTable.NewRow();
dataRow["ID"] = 1;
dataRow["Ad"] = "Mehmet";
dataTable.Rows.Add(dataRow);

DataRow dataRow2 = dataTable.NewRow();
dataRow2["ID"] = 23;
dataRow2["Ad"] = "Ahmet";
dataTable.Rows.Add(dataRow2);

DropDownList1.DataSource = dataTable;
DropDownList1.DataValueField = "ID";
DropDownList1.DataTextField = "Ad";
DropDownList1.DataBind();
}
}

protected void Button1_Click(object sender, EventArgs e)
{

}
}
Bu örnek sayfamız ilk kez yüklendiğinde, drop-down listemiz Page_Load metodunda yarattığımız DataTable'daki iki elemanı listeliyor olacaktır (doğal olarak).
Şimdi, yolla düğmesine basıp sayfamızı post ettiğimizde ise Page_Load metodu yine çalışacak, ancak bu defa Page.IsPostBack == false şartı doğrulanmayacağı için DataTable ve içindeki elemanlar drop-down listeye bağlanmayacaklardır. Fakat sayfa ikinci kez yüklendiğinde de daha önceki iki liste elemanı yine drop-down ıcinde listelenmiş olarak göreceğiz.

Peki, nasıl oluyorda drop-down listemiz bir önceki hal ve durumunu muhafaza ediyor? VIEWSTATE sayesinde !

ASP.NET drop-down kontrolünün orijinal içeriğini, kripto edip sayfanın oluşturulması esnasında
__VIEWSTATE gizli alanına yerleştiriyor. (Sayfa üzerindeki diğer kontrollerin içeriği de aynı şekilde __VIEWSTATE alanına kaydedilir, tabii EnableViewState="false" değillerse.)

Sayfa postback sonrası yeniden yüklenirken, VIEWSTATE'deki kriptolanmış içerikler sırası ile gerekli kontrollere yeniden bağlanırlar.

İşte bu otomatik olarak yapılan hal/durum muhafazası ASP.NET WebFormlarına özgü bir kavram olan VIEWSTATE olarak bilinir.

Not: Programatik olarak da VIEWSTATE içine değer yerleştirmek ve postback sonrası bu değeri okumak da mümkündür. Bu teknik Session değişkenleri kullanımına bir alternatiftir. Ancak Session değişkenleri gibi bütn bir oturum boyunca değil, sadece aynı sayfa üzerinde kullanılabilirler.

Örnek:
        protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack ==false)
{
//sayfa ilk yüklenirken ViewState kolleksiyonunda degisken yaratalim
ViewState["F5Test"] = "Viewstate test";
}
else {
string f5Test = ViewState["F5Test"].ToString();
}
}

VIEWSTATE'in özetle ne iş yaptığını ve var oluş nedenlerini inceldikten sonra şimdi de, eğer disiplinli bir şekilde kontrol altına alınmazsa, özellikle internet sitelerinde, yani arama motorları tarafından endekslenmesini istediğimiz sitelerde, ne gibi zararlı etkileri olabileceğini irdeleyelim.

İnternet siteleri için her bir KB ve her bir mili saniye bile arama motorlarının siteyi puanlamasında önem sahibi. Bu yüzden sayfalarımızın HTML çıktılarının minimumda tutlması çok önemlidir. ASP.NET otomatik hal/durum takibi için EnableViewState parametresini true olarak varsayar. Bu demektir ki eğer biz buna bir dur demezsek, sayfamız üzerindeki asp:Label'lar dahi VIEWSTATE değerinde kendine yer bulacaklardır ve projemiz ilerledikçe __VIEWSTATE gizli alanında ki değer büyüdükçe büyüyecektir.

Bu yüzden, özellikle internet siteleri için, ihtiyacımız olmayan alanlar ve kontroller için mutlak suretle EnableViewState parametresi false durumuna getirilmelidir. Eğer EnableViewState'in otomatik olarak false olarak kabul edilmesini istiyorsak, bunu web.config dosyasında ile yapabiliriz.




Yorumlar


Viewstate'i güzel açıklamışsınız, teşekkürler. MVC ile ilgili makale olacakmı derginizde ya da sitenizde?
Talat @ 19.4.2012 08:09:03

Sizin yorumunuz

Email


Adınız







F5 Dergi © 2017