İlk konumuz Asp.net ajax web methodlarla ilgili olacak.
Page Method nedir?
Asp.net server-client bazlı çalışma mantığına sahip olduğu için bir sayfanın çağrılması o sayfa ile ilgili olan bütün eventlerin ve nesnelerin yeniden oluşturulması anlamına gelmektedir. Update panel ile sayfamızda asenkron callback işlemi başlatsak bile, update panel içerisindeki tüm veriler server tarafına aktarılır ve sayfanın life-cycle’ı yeniden oluşturulmuş olur. Bu durum (Partial Postback in Update Panel), tüm sayfanın ve controllerinin viewstate ile taşınmasından daha iyi bir durumdur. Bunun yanında geliştirme açısından çok hızlı çözümler üretmemizi sağlar. Eğer uygulamızın çok hızlı çalışmasını istiyorsak, sayfanın sunucu tarafında yeniden üretilmesi ve life-cycle içerinde bazı olayların her defasında tekrarlanmasını istemiyorsak bu noktada ortaya Page Method’ lar çıkıyor.
Neden Page Method’lar Daha Hızlıdır?
Page method’lar static methodlar olduğu için sayfada tetiklendiğinde taşıyıcısı olan page class’ının eventlerini tetiklemez ve page yeniden oluşturulmaz. Aşağıdaki c# örneğinde GetMessage methoduna ulaşmak için Sample.GetMessage() dememiz yeterli olacaktır. Sample nesnesinin bir örneği oluşturulmaz veya içerisinde bazı eventler olmuş olsa bunlar tetiklenmez. PageMethod’ların da page classı içerisinde static olması bundan farklı bir durum değildir. Hatta daha önemlisi update panel içerisinde taşınan ViewState datasına ihtiyacı yoktur. Bu da ona ciddi bir performans katmaktadır.
Page method’lar static methodlar olduğu için sayfada tetiklendiğinde taşıyıcısı olan page class’ının eventlerini tetiklemez ve page yeniden oluşturulmaz. Aşağıdaki c# örneğinde GetMessage methoduna ulaşmak için Sample.GetMessage() dememiz yeterli olacaktır. Sample nesnesinin bir örneği oluşturulmaz veya içerisinde bazı eventler olmuş olsa bunlar tetiklenmez. PageMethod’ların da page classı içerisinde static olması bundan farklı bir durum değildir. Hatta daha önemlisi update panel içerisinde taşınan ViewState datasına ihtiyacı yoktur. Bu da ona ciddi bir performans katmaktadır.
- Public class Sample
- {
- Public static string GetMessage()
- {
- return DateTime.Now;
- }
- }
Bloglarda çokça incelenen bir konu üzerinde durmak istiyorum. Bu konunun çözümü ile ilgili küçük bir örnekle Page Method’lar konusundan daha detaylı ve ince noktalara değinmiş olacağız.
User Controls,Master Page ve Page üçlemesinde PageMethod
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.Services;
- namespace AjaxPageMethode.UserControl
- {
- public partial class ctrl_Alert : System.Web.UI.UserControl
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- }
- [WebMethod]
- public static string GetMessage()
- {
- return "Test Methode" + DateTime.Now;
- }
- }
- }
- <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ctrl_Alert.ascx.cs" Inherits="AjaxPageMethode.UserControl.ctrl_Alert" %>
- <script type="text/javascript">
- //<![CDATA[
- function GetMessageFromPageMethode() {
- PageMethods.GetMessage(OnSucces, OnError);
- }
- function OnSucces(result) {
- alert(result);
- }
- function OnError() {
- var stackTrace = error.get_stackTrace();
- alert(stackTrace);
- }
- //]]>
- </script>
- <asp:button id="btnShowMessage" runat="server" onclientclick="javascript:GetMessageFromPageMethode();" text="Show Message">
- </asp:button>

Yukarıda örnekte ctr_Alert.ascx usercontrolu içerisinde static web method ve html tarafında bir javascript ile static metod sonucu dönen string’i alert olarak vermeye çalışacağız. Senaryo basit gibi gözüksede
sayfayı çalıştırdığımızda resimdeki çıktıyı aldığımızda şaşırmamalıyız. Malesef usercontrol içerisinde pagemethodları kullanamıyoruz. Çünkü usercontrol yukarıda da görüldüğü gibi
usercontrol tipinden inherit edilmiştir. Bunun çözmek için usercontroller içerisindedeki pagemethodları kullanacağımız sayfalara taşımalıyız.

public partial class ctrl_Alert : System.Web.UI.UserControl
usercontrol tipinden inherit edilmiştir. Bunun çözmek için usercontroller içerisindedeki pagemethodları kullanacağımız sayfalara taşımalıyız.
Örneğin usercontrolü eklediğim default.aspx ‘e
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- }
- [WebMethod]
- public static string GetMessage()
- {
- return "Test Methode" + DateTime.Now;
- }
- }
Web metoudunu eklediğimizde ise basit olan senaryonun ilk problemini çözmüş olacağız. Bu bizim açımızdan pek tatmin edici bir çözüm olmayabilir. Çünkü yazdığımız Composite ve Custom controllerin PageMetholarının kendi içerinde olması kodun düzenlenmesi ve ilerideki güncellemeler göz önüne alındığında dezavantajları vardır.

Not: En azından, page methodları kullanan scriptleri user control içerisinde tutabilirsiniz. Sadece PageMethodu o user controlü çağırdığınız sayfaya eklemeniz yeterli olacaktır.
Tabii sayfaya script manager ekleminiz ve EnablePageMethode propertysini True yapmanız gibi ufak detayları bildiğinizi varsayarak bunlar üzerinde durmayacağım.
Aynı senaryoyu masterpage üzerinde denediğimizde, aşağıdaki gibi bir yapıya sahip olacak.
Aynı senaryoyu masterpage üzerinde denediğimizde, aşağıdaki gibi bir yapıya sahip olacak.
- <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="TestMaster.master.cs" Inherits="AjaxPageMethode.TestMaster" %>
- <asp:contentplaceholder id="head" runat="server">
- </asp:contentplaceholder>
- <script type="text/javascript">
- //<![CDATA[
- function GetMessageFromPageMethode() {
- PageMethods.GetMessage(OnSucces, OnError);
- }
- function OnSucces(result) {
- alert(result);
- }
- function OnError() {
- var stackTrace = error.get_stackTrace();
- alert(stackTrace);
- }
- //]]>
- </script>
- <form id="form1" runat="server">
- <asp:scriptmanager id="ScriptManager1" enablepagemethods="true" runat="server">
- </asp:scriptmanager>
- <div>
- <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
- </asp:contentplaceholder>
- <asp:button id="btnShowMessage" runat="server" onclientclick="javascript:GetMessageFromPageMethode();" text="Show Message">
- </asp:button></div>
- </form>
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.Services;
- namespace AjaxPageMethode
- {
- public partial class TestMaster : System.Web.UI.MasterPage
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- }
- [WebMethod]
- public static string GetMessage()
- {
- return "Test Methode" + DateTime.Now;
- }
- }
- }
Bu senaryoda da master page’imizi test.aspx adlı bir sayfanın master page’i olacak şekilde düzenlediğimizde yine aynı nedenle (Master page’in
System.Web.UI.MasterPage
‘ten inherit edilmiş olması) pageMethodmuzun çalışmadığını göreceğiz.
Yine birinci çözümdeki gibi PageMethodumuzu master page’ten alıp hangi sayfanın master’ı olarak belirleyeceksek tüm sayfalarda bu methodu oluşturmalıyız. Yukarıdaki ilk örnekteki gibi scriptlerin master page içerisinde kalması daha iyi olacaktır.
Page Methodların bu denli handikapları ortaya çıkınca aklımıza birçok avantajı ve kullanım kolaylıkları bulunan web serviceleri gelmektedir; hatta kendi c# model tiplerimizi javascript’e result set halinde aktarabileceğimiz web serviceler. Gelecek yazımızda web servislerinin avantajları ve hiç eksik olmasın
dezavantajları üzerinde durup Linq To sql model tiplerimizi serileştirerek javascript fonksiyonları ile elde edip, bu verileri web sayfalarımızda göstereceğiz.

Teşekkürler.
Hiç yorum yok:
Yorum Gönder