ASP.NET kontrollerin ReadOnly veya Disable edilmesi

Web uygulamalarımızda form kontrollerini, kullanıcının müdahelesini engellemek için readonly veya disable ederiz. Bütün ASP.NET Web kontrollerinin Enabled property’si bulunur. Bu property’inin değerini false olarak seçtiğimizde kontrol, HTML elementi olarak render edildiği zaman disabled niteleğiyle işaretlenmiş olur.

Server tarafında bu şeklinde tanımlanmış kontroller, aşağıdaki şekilde render edilir.

Bu durumda IE veya Firefox tarafında bu elementler gri modda görünecek ve kullanıcının bu kontrollere fokuslanması veya değerini değiştirmesi engellenmiş olacaktır.
Textbox kontrolünde bu property’e ek olarak ReadOnly property’si bulunur. CheckBox, RadioButton, DropDownList, RadioButtonList, CheckBoxList gibi kontrollerde bulunmayan bu property, TextBox kontrolünün sadece okunabilir olmasını sağlar. Bu durumda TextBox kontrolü browser içerisinde gri modda girmeyecek(içindeki metnin rengi gri olmayacak) aynı zaman kullanıcının bu kontrole fokuslanmasına izin verilmiş olacaktır. Disabled gibi readonly durumunda da kullanıcı, kontrolün değerini değiştiremez. Disable ile ReadOnly arasındaki bu basitten farktan daha önemli bir fark bulunmaktadır.
W3C’nin standart literatörüne göre disable edilmiş kontroller, not successful, read-only kontroller ise successful niteliğindedir. Successful kontrol, ID’si ve değeri olan ve en önemlisi sunucuya gönderilecek “form data set” veri tablosuna dahil edilen kontrollerdir. Yani form içerisinde bulunan disable olarak işaretlenmiş kontroller, post veya querystring yöntemiyle sunucuya gönderilmez. Bu yüzden ASP.NET uygulamalarında Enabled=”false” olarak işaretlenmiş kontrol bilgileri, form postback yapıldığı zaman sunucuya gönderilmez. Aşağıdaki küçük örnekte 3 tane TextBox bulunmaktadır.

Bir button aracılığıyla sayfayı submit ederek form elementleri ve onlara ait değerleri okuyalım.

foreach (string Key in Request.Form)
    Response.Write(Key + " : " + Request.Form[Key] +"");

Bu durumda aşağıdaki sonucu elde ederiz;TextBox2 : 2
TextBox3 : 3
Görüldüğü gibi TextBox1 elementiyle ilgili herhangi bir bilgi post header’da bulunmamaktadır.
Konuyla ilgili diğer sıkıntımız şudur;ASP.NET Framework, read-only veya disabled olarak işaretlenmiş kontrollerin ViewState property’si false yapılır. Bu da demektir ki sunucu tarafında bu kontrollerin değerleri sunucu tarafından hatırlanmayacak ve code-behind’taki kodlarımızda bu kontrollerin değerleri boş gelecektir. Örneği aşağıdaki gibi düzenleyelim ve sanki kullanıcı tarafından değerleri değiştirilmiş gibi JavaScript ile bu kontrollerin değerlerini değiştirelim.

Daha sonra postback işlemini yapmış Button’un click eventini aşağıdaki kodları yazalım.

protected void Button1_Click(object sender, EventArgs e)
{
    Response.Write("TextBox1.Text : " + TextBox1.Text + "");
    Response.Write("TextBox2.Text : " + TextBox2.Text + "");
    Response.Write("TextBox3.Text : " + TextBox3.Text);
}

Bu durumda sadece TextBox3 kontrolünün değerini okuyabiliriz.
TextBox1.Text :
TextBox2.Text :
TextBox3.Text : 3

Oysa özellikle ilişkisel veritabanlarında kullandığımız ID bilgilerini bu şekilde JavaScript aracılığıyla set edilmesini sağlayabiliriz. ASP.NET 2.0 ile birlikte gelmiş bu güvenlik bariyerini iki şekilde aşabiliriz ya TextBox1.Text yerine Request[this.TextBox1.UniqueID] şeklinde ASP’den gelme yöntemi kullanacağız ya da bu kontrolleri code-behind tarafında attribute ekleme yöntemiyle Read-Only yapacağız. Yani design aşamasında read-only olmamış olacak. Kontrol render edildikten sonra readonly ifadesi eklenmiş olacak.

PageLoad() metodunda kontrole attribute ekleyelim.

protected void Page_Load(object sender, EventArgs e){
    if (!IsPostBack)
        TextBox2.Attributes.Add("readonly", "readonly");
}

Bu durumda code-behind tarafında “TextBox2.Text” ifadesini kolaylıkla okuyabiliriz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.