ViewState (Görüntü Durumu)

Eyl 06, 2013

ASP.Net platformunda verilerin sayfalar arasında aktarımı ve saklanması sorunu ortaya  State Management (Durum Yönetimi) kavramını çıkarmıştır. Viewstate (Görüntü Durumu) de, State Management kapsamında geliştirilen teknolojilerden biridir. Sayfa sunucuya her gidiş gelişinde (postback), o anda sayfada bulunan verilerin saklanmasını ve kaybedilmemesini sağlar.

Viewstate ASP.Net ile varsayılanda (default) açıktır. Sayfanın tarayıcıdan sunucuya gönderilirken sahip olduğu verileri saklı tutar ve sayfa tekrar oluşturulurken bu verileri sayfaya ekler. Bu nedenle hem "postback", hem de istek (request) süresini uzatır. Bu sebepten dolayı, kullanırken dikkatli olmak gerekir.

Bunun yanı sıra, Viewstate her türden verinin tutulabileceği bir koleksiyon olarak da kullanılabilir.   

Viewstate’in ilk kullanılışını görmek için, yeni oluşturulan bir Web sitesinin kaynağı görüntülenir.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
      <head>
            <title></title>
      </head>
      <body>
             <form method="post" action="Default.aspx" id="form1">
             <div class="aspNetHidden">
             <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZKs/5CkgbTE0g6t2/9Nd5Lyq4Vlj1NZJxWMQ1jxuDHa+" />
             </div>
             <div></div>
             </form>
       </body>
</html>

Viewstate görüldüğü gibi bir girdi (input) değeri yaratır. Bu değeri base64 koduna çevirerek saklar. Ancak veriler güvenli değildir. Veriler kodlanır, fakat şifrelenmez.

İkinci bir kullanımı ise, bir Viewstate nesnesi yaratıp içine veri atayarak bir koleksiyon gibi kullanmaktır. Bunu göstermek için, sayfanın "postback" sayısını tutan bir Viewstate uygulaması aşağıdaki gibidir.

Default.aspx sayfasına aşağıdaki kod parçası eklenir.

<asp:TextBox ID="Textbox1" runat="server"></asp:TextBox>
<asp:Button id="Button1" runat="server" OnClick="Button1_Click" />

Sayfanın kod kısmına aşağıdaki metodlar eklenir.

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
                ViewState["PostBackCounter"] = 0;
        int counter = (int)ViewState["PostBackCounter"];
        Textbox1.Text = counter.ToString();
    }
    protected void Button1_Click(object sender, System.EventArgs e)
    {
        int oldCount = (int)ViewState["PostBackCounter"];
        int newCount = oldCount + 1;
        Textbox1.Text = newCount.ToString();
        ViewState["PostBackCounter"] = newCount;
    }

Bu uygulama sonucu oluşan sayfaya ilk kez girildiğinde Textbox'ta aşağıdaki gibi 0 değeri görülür.

 

Session State ile Viewstate arasındaki farklar aşağıdaki gibi sıralanabilir:
  • ViewState sadece o anki sayfayla ilgili olan durum verileri ve sayfanın çeşitli kontrolleri için geliştirilmiştir. Herhangi bir durumda ViewState yeni bir sayfaya yollanamaz veya sunucu iletimi yapılamaz. Eğer bir çok sayfa arasında veri iletimi yapılacaksa, Session nesneleri kullanılabilir.
  • Saklanmak istenen veriler Viewstate ile tutulurken siteye yük yapıyorsa Session kullanmak daha verimli olur. Fakat, kısa bir süreçte çok fazla Session nesnesi yaratmak sunucuların aşırı yüklenmesine sebep olur.