ASP.NET 4.0 ve ClientIDMode

Geçmiş bir eğitim ve danışmanlık sürecinde bir katılımcı şöyle bir soru sormuştu. "Hocam bu ASP.NET üzerinde sistemin otomatik ürettiği nesnelerde Client tarafında Javascript ile çalışırken çok zorlanıyoruz çünkü hiç düzgün isimler vermiyor". ("ctl00_ContentPlaceHolder1_ProductRepeater_ctl01_AddBasket")
Bu sorun özellikle DataBinding ile tekrarlayan itemlar oluşturan data nesnelerinde ("Repeater", "DataList" vs.. ) karşımıza çıkmaktadır. Visual Studio 2010 ve ASP.NET 4.0 sürecine geldiğimizde bunun bir çözümü var.
İşte ASP.NET 4.0 yeniliklerden biride ClientIDMode propertysi. Nesneyi Server tarafında tanımlarken artık Client tarafındaki ismini belirleyebileceksiniz.
Bu noktada karşımıza ClientIDMode propertysi çıkmaktadır. Bu propertyi için 4 adet seçenek bulunmaktadır. Aşağıdaki kod üzerinde ClientIDMode özelliğini değiştirerek snuçları gözlemlediğimizde;
<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
    <%#Eval("Adi") %> , <%#Eval("Soyadi") %> <asp:Button ID="SecButton" runat="server" Text="Seç" ClientIDMode="AutoID" /> <br />
    </ItemTemplate>
    </asp:Repeater> 

Değer 
Açıklama 
 AutoID
Bu değer seçildiği durumda Controller Parent nesneden başlayarak ve aralara _ ekleyerek son noktada CTLXX ifadesi ile kaçıncı olduğunu gösterir ifade ve ardından Server ID eklenerek Client ID üretilmektedir.
<input type="submit" name="Repeater1$ctl00$SecButton" value="Seç"id="Repeater1_ctl00_SecButton" />
<input type="submit" name="Repeater1$ctl01$SecButton" value="Seç"id="Repeater1_ctl01_SecButton" />
Bir web sayfası için bu değer varsayılandır. Controller için varsayılan değer ise inherit seçeneğidir. Controllerde miras yolu ile web sayfası için varsayılan olan bu AutoID seçeneğini almış olurlar.
 Static
Bu değer seçildiği durumda, Controle ait Server ID değeri Client ID olarakta karşımıza çıkmaktadır. Bu noktada özellikle otomatik oluşan itemlarda tekrar eden nesnelerin aynı isimle tekrar ettiğine dikkat edelim.
<input type="submit" name="Repeater1$ctl00$SecButton" value="Seç"id="SecButton" /><input type="submit" name="Repeater1$ctl01$SecButton" value="Seç"id="SecButton" />
Yukarıda da gördüğümüz gibi id propertyleri static seçiminden dolayı aynı isimle tekrar edilmiştir. Javascript ile yapacağınız müdahale her iki butonuda etkileyecektir. Bununla birlikte ayırdedicilik özelliğinide kaybetmiştir.
 Predictable
 Bu değer seçildiği durumda Client ID oluşmasında 2 durum karşımıza çıkmaktadır.
1. Herhangi bir ek tanımla ve müdahale olmadığı taktirde
<input type="submit" name="Repeater1$ctl00$SecButton" value="Seç"id="Repeater1_SecButton_0" />
<input type="submit" name="Repeater1$ctl01$SecButton" value="Seç"id="Repeater1_SecButton_1" />
Yukarıda da gördüğümüz gibi ParentControl _Kontrol_ArtanSayı şeklinde bir yapı oluşmaktadır. Okunurluğu ve kullanımı kolaydır.
2. IDataBoundListControl arayüzünden türemiş olan ListView ve GridView gibi nesnelerde ClientIDRowSuffix isminde bir özellik bulunmaktadır. Bu Özellik ClientID belirlemede son aşama olan ArtanSayının yerine kullanılacak olan değeri ifade etmektedir. Bu tanımlamanın data kaynağından gelmesi gerektiğini unutmayalım.
Mesela : Veri kaynağımızın aşağıdaki gibi bir class'a dayanan bir List olduğunu düşünürsek
 public class Kisi
    {
        public string Adi { get; set; }
        public string Soyadi { get; set; }
    }
 List<Kisi> kisiler = new List<Kisi>() {new Kisi(){Adi="Resul",Soyadi="Cavusoglu"},new Kisi(){Adi="Mehmet",Soyadi="Ahmedov"} };
<asp:ListView ID="ListView1" runat="server" ClientIDRowSuffix="Adi">
    <ItemTemplate>
    <%#Eval("Adi")%> <br />
        <asp:Button runat="server" ID="SecButton" Text="Button" ClientIDMode="Predictable" />
    </ItemTemplate>
      
    </asp:ListView>

Client tarafında sonuc aşağıdaki gibi olacaktır. ID ait son aşamanın Adi veri alanından geldiğine dikkatinizi çekmek isterim.
<input type="submit" name="ListView1$ctrl0$SecButton" value="Button"id="ListView1_SecButton_Resul" />
 <input type="submit" name="ListView1$ctrl1$SecButton" value="Button"id="ListView1_SecButton_Mehmet" />

 Inherit Bu değer seçildiği durumda, Control bu property ait değeri Parent durumdaki controlden miras alır. Bu değer aksi belirtilmediği durumlarda varsayılan değerdir.

Resul hocam direkt aldım hakkını helal et, kar amaçlı değil unutmamak için buraya koydum.
Alıntı:Resul Çavuşoğlu

Yorumlar

Bu blogdaki popüler yayınlar

Asp.Net ile Uyarı Mesajları Vermek (msgbox)

Asp.Net ile T.C. Kimlik Doğrulama (Mernis) Web Service ile

Asp.Net Eval Kullanımı