Bknz. : http://www.microsoft.com/windows/internet-explorer/beta/
Custom kontrol geliştirirken bu kontrollerin bazı ekstra özelliklerini client tarafında javascript’ler ile kullanmak gerekebiliyor. Kontrolleri başka kontroller ile ilişkilendirmek, kontrollerin standart özelliklerinden başka özellikler ile kontrolleri zenginleştirmek için tercih edilebilecek bir yöntem bu.Peki nasıl yapıyoruz?
public class ServerControl1 : Label
{
public override void RenderControl(HtmlTextWriter writer)
{
writer.AddAttribute(“AnotherControlType”,
“AnotherCustomServerControl1”);
base.RenderControl(writer);
}
}
Yukarıdaki kod parcasında basitce bir örnek var. Sayfamız render olduğu zaman aşağıdaki gibi bir html çıktısına sahip olacaktır.
http://download.microsoft.com/download/6/3/3/633118BD-6C3D-45A4-B985-F0FDFFE1B021/EN/7000.0.081212-1400_client_en-us_Ultimate-GB1CULFRE_EN_DVD.iso adresinden Windows 7’nin 32-bit versiyonun Beta sürümünü indirip test edebilirsiniz….
Asp.Net Ajax ile, Ajax teknolojisinden oldukça kolay bir şekilde yararlanabiliyoruz. Bazı şeyleri o kadar kolaylaştırıyor ki, nasıl çalıştığını fazla sorgulamadan kullanıyoruz. Peki doğru mu kullanıyoruz?
Bazı şeyleri ajax ile halledip, sayfalarımızın fonksiyonlarını genişletsekte aslında bir çok yanlış yapabiliyoruz. Bunlardan en büyüğü Asp.net Ajax ile beraber karşımıza çıkan UpdatePanel’i kullanma şeklimiz.. Update Panel kontrolü, Asp.net’de ajax destekli bir uygulama yapmak istediğimizde sanırım en çok kullanacağımız kontrol. Temel olarak yaptığı şey Partial Rendering. Yani sayfanın belli bir kısmını, server tarafından gelen bilgi ile yeniden Render etmek.
<asp:ScriptManager ID=”ScriptManager1″ runat=”server”>
</asp:ScriptManager>
<asp:UpdatePanel ID=”UpdatePanel1″ runat=”server”>
<ContentTemplate>
<asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label>
<asp:Button ID=”Button1″ runat=”server” onclick=”Button1_Click” Text=”Button” />
</ContentTemplate>
</asp:UpdatePanel>Codebehind’da ise Button1_Click methodunuz vardır.
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = “arda”;
}
Yukarıdaki kod örneğinde de, UpdatePanel’in içine koyduğumuz Button’a tıkladığımız zaman server tarafındaki methodumuz çalışacak ve sayfa postback olmadan iligli Label değişecektir. Buraya kadar herşey iyi hoş. Peki server’a ne gidiyor ne geliyor? Bu kadar basit bir işlem için sadece “arda” yazısının server tarafından gelmesini umuyoruz.Ya da öyle sanıyoruz. Ama Web Development Helper gibi programlar ile giden sorguları ve gelen sonuçları gözlemlediğimiz zaman gelen bilgi oldukça farklı.Komple HTML yapısında, kontrolümüzün client tarafında render edilmesi gereken hali,server tarafında render edilmiş olarak geliyor.
219|updatePanel|UpdatePanel1|
<span id=”Label1″>arda</span>
<input type=”submit” name=”Button1″ value=”Button” id=”Button1″ />|220|hiddenField|__VIEWSTATE|/wEPDwUJLTMyMjU1MTk5D2QWAgIDD2QWAgIDD2QWAmYPZBYCAgEPDxYCHgRUZXh0BVphcmRhCmFyZGEKYXJkYQphc
mRhCmFyZGEKYXJkYQphcmRhCmFyZGEKYXJkYQphcmRhCmFyZGEKYXJkYQphcmRhC
mFyZGEKYXJkYQphcmRhCmFyZGEKYXJkYQpkZGRJeTB5jsLrxLhDSFm1xhBPamTKRA==
|48|hiddenField|__EVENTVALIDATION|/wEWAgKbzLDvAgKM54rGBm6DEpmB2Hi6tmqot
9F2a91GT/Sp|0|asyncPostBackControlIDs|||0|postBackControlIDs|||13|updatePanelID
s||tUpdatePanel1|0|childUpdatePanelIDs|||12|panelsToRefreshIDs||UpdatePanel1|2|
asyncPostBackTimeout||90|13|formAction||WebForm1.aspx|
Bu basit işlem için gönderdiğimiz request’in sonucu yukarıdaki gibi. Böyle bir işlem için oldukça büyük bir veri. Daha büyük ve geniş içerikli operasyonlarda bu çok daha büyük bir veriye dönüşecektir. Bandwidth gibi kısıtlamaları olan sistemlerde bence çok büyük bir sorun. Bunun dışında da performans açısından zaten genel olarak büyük bir sorun. Bu sorunu UpdatePanel’i kullanmadan yapabiliriz.PageMethods kavramı bu noktada ortaya çıkıyor. Ki bence Asp.Net Ajax’ın en güzel özelliği.PageMethods sayesinde, client tarafından, server methodlarını çağırabiliyor olmamız. Asp.Net Ajax ile çağırdığımız eğer PageMethods’un sonucu bize JSON olarak dönüyor.Bundan dolayı dönen veri oldukça basit ve sade oluyor.
<script type=”text/javascript”>
function Click() {
PageMethods.SomeMethod(OnSucceeded, OnFailed);
}function OnSucceeded(result, userContext, methodName) {
$get(‘Label1’).innerHTML = result;
}function OnFailed(error, userContext, methodName) {
$get(‘Label1’).innerHTML = “Hata oluştu.”;
}
</script>
…………….
……….
…..
……
..<asp:ScriptManager ID=”ScriptManager1″ runat=”server” EnablePageMethods=”true”></asp:ScriptManager>
<asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label>
<asp:Button ID=”Button1″ runat=”server” OnClientClick=”Click();return false;” Text=”Button” />
Codebehind’da ise;[WebMethod]
public static string SomeMethod()
{
return “arda”;
}
Burada önemli olan noktalar, codebehind’dan çağıracağımız methodun WebMethod attribute ile tanımlanmış olması,static bir method olması ve tabi ki string dönüyor olması. MarkUp tarafında ise ScriptManager’da EnablePageMethods’un true olması gerekmekte. Aksi takdirde methodları çağıramazsınız. Client tarafından çağıralan SomeMethod()’un dönüş değeri JSON formatında olacaktır.Yukarıdaki kod bloğundan javascript ile nasıl çağırıldığına dikkat etmek gerekiyor. PageMethods.SomeMethod(); şeklinde çağıralan methoda parametre olarak 2 tane fonksiyon gönderiyoruz ve bunları tanımlıyoruz. Bunlardan biri bu SomeMethod() methodunun başarılı bir şekilde çalışmasının sonucu çalışacak method(OnSucceeded) diğeri ise tam tersi durumunda hata oluştuğunda çalışacak method(OnFailed).Server tarafında çalışan SomeMethod() sorunsuz olarak çalışırsa client tarafında yapılacak olan değişiklikleri OnSucceeded methodunda yaparız. Burada altını çizmek istediğim nokta server tarafından bu request sonucu dönen değer.
{“d”:”arda”}
Bu değer sadece yukarıdaki gibi JSON formatında olacaktır, ve boyut olarakta diğer yönteme göre kıyaslandığında çok daha küçük olacaktır.İhtiyaca göre bu tarz şeyleri göz önüne alarak geliştirme yapmak uygulamalarımız için daha sağlıklı olacaktır.Şimdilik bu kadar,ilerleyen yazılarda çoooook daha ilginç ayrıntılara değiniyor olacağım.Çok gaza geldim sormayın 😀