Orta çaplı ya da büyük boyutlu uygulamalarda genellikle uygulama birçok kişi ya da birden fazla takım tarafından geliştirilmekte ve kayank kod kontrolü programları ile ( source safe, cvs, svn gibi ) projelerini yönetmektedirler.Asp.net uygulamalarında, web.config dosyasında  kişilerin ya da takımların kendilerine özel appSettings altında tutacak değerleri veya connectionStrings altında tutacak farklı veritabanı bağlantı bilgileri olabilir. Kimi durumlarda "check out" edilen web.config üzerinde degişiklik yapıldıkdan sonra ( ki bu bazen ekleme bazen de düzenleme olabilir ) "check in" yapılarak tekrar güncellenir. Bu kimi durumlarda birçok hataya ve aksaklığa neden olabiliyor. Bu durumda ilk akla gelen çözüm tüm uygulamada ortak kullanılacak değerler web.config dosyasına konur, test amaçlı, kişiye özel ya da takıma özel kısımlar ise harici bir dosyada tutulara web.config dosyası ile ile ilişkilendirilebilir.

Örneğin A takımının tüm projeden bağımsız kendisine özel bazı değerleri ve yine kendisine özel veritabanı bağlantısı bilgilerini harici olarak tutmak istediğini ama tüm projedeki ortak değerleri ve veritabanı bağlantı bilgilerini de kulanmak istediğini düşünelim. Bu durumda kendisine ait özel verileri web.config haricinde başka bir dosyada tutup, web.config dosyasında da bazı düzenlemelerden sonra diğer takım arkadaşlarının ya da aynı web.config'i kullanan diğer takımların başını ağrıtmayacaktır :)

Resimden de görüldüğü gibi projeme connectionstring lerimi ve appsetting lerimi yerleştirmek için iki ayrı dosya ekledim ( dosya isim ve uzantilarında zorunluluk yoktur. )

Ateam_local_connections.config dosyasının içeriği aşağıdaki gibi;

<connectionStrings>
  <add name="Atakiminaozelbaglanti" connectionString="Atakimi baglanti bilgileri..."/>
</connectionStrings>

Ateam_local_settings.config dosyasının içeriği de

<appSettings>
  <add key="Atakiminaozel" value="beniAtakimiOkur"/>
  <add key="exts" value="jpg,png"/>
</appSettings>

gibidir. web.config dosyamızı da aşağıdaki gibi düzenledikten sonra test edebiliriz.

<appSettings file="Ateam_local_settings.config">
    <add key="globalValue" value="Beni herkes bilir!"/>
</appSettings>
<connectionStrings  configSource="Ateam_local_connections.config">
</connectionStrings>

bu kısımda dikkat edilecek nokta connectionStrings kısmına eğer harici bir dosya kullanacağınızı tanımlarsanız <connectionStrings> tagları arasına başka bir connectionstring tanımlaması yapamıyor oluşunuzdur.

Test kodumuz aşağıdaki gibidir.

    protected void Page_Load(object sender, EventArgs e)
    {
        //genel appSettings okunuyor
        Response.Write(ConfigurationManager.AppSettings["globalValue"]);
        
        //A takimina ozel degerler okunuyor
        Response.Write("<br>"+ConfigurationManager.AppSettings["Atakiminaozel"]);

        //A takimina ozel connectionString okunuyor
        Response.Write("<br>"+ConfigurationManager.ConnectionStrings["Atakiminaozelbaglanti"].ConnectionString);
    }
 

Saç baş yolduran problemsiz çalışma ortamları dilerim :)


 
Categories: Asp.net | Code | Inceleme

Alper Hocam ile sık sık "yahu bu http'nin değişmesi lazım, browserların değişmesi lazım, geri kaldı birçok gelişmeye göre..." diye başlayan birçok sohbetimiz olmuştur. Ben de boş zamanlarımda "acaba değiştirsek neresinden nasıl başlardım?, dur bakalım şu HTTP'nin ince ne detayları varmış" diyerek HTTP'nin birçok detayını inceleme kararı almıştım. Araştırmalarım sırasında şu link biraz şaşırttı beni açıkcası.

Dökümanın dediğine göre bir resim dosyası base64 formatına çevrilip <img> tagına verildiğinde standartlara göre browserların bunu görüntülemesi gerekiyor ( bilin bakalım kim desteklemiyor olabilir ? ;) ). Küçük bir test kodu ile bunu denedim. Herhangi bir resim dosyasını base64 formatındaki bir string'e çeviren kod aşağıda.
 public string GetStringFromImage(string path)
{
return Convert.ToBase64String(File.ReadAllBytes(path));
}
Görüntülenmesi istediğim resim ise ;



HTML kodum ise aşağıda. Formata dikkat ederseniz - aslında şemaya -
data:[<mediatype>][;base64],<data>
şeklinde.

<img src="data:img/gif;base64,R0lGODlhYQAWAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD//////
wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wD
MAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADN
mMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmY
AmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMm
WbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM
5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswz
mcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz/
//8AAP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZ
v/Mmf/MzP/M////AP//M///Zv//mf//zP///ywAAAAAYQAWAAAI0gAfCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsmRDAAAoosy
48iTKlwNfykx5sGVMmhJtWtSp0CZPngZ/4owIdKTPoQ+K3tTZ8ijMpU+TyrwplWZUpUFxCu0ZVarXmla1hqVaVeDTpkgTztyKEC3UgmvNipVL9mj
dtG2HMsVL92tVvXP9op3ZV/BYlwT35o3r1W5fx0Udf8UKF3BivoonH9Ysd7Pbwp8ZrkWqNDNkwp0NXw3M2aTr17Bjy55Nu7bt2xQDAgA7" />

Eğer yukardaki şekilde değil de kod ile base64 string'ini direk <img> tagına atamak istiyorsanız aşağıdaki kod sorunu çözecektir.

<img src="data:img/gif;base64,<%Response.Write(Convert.ToBase64String( System.IO.File.ReadAllBytes("C:\\vs.gif"))); %>" />

Sonuç; ie7 - yamulmuyorsam -  desteklemez iken, Firefox bunu başarılı bir şekilde görüntülüyor.



Tabi bu yöntemle resim göstermek neye yarar, limitleri var mıdır, yok mudur tarzında sorularınız için şu linkden faydalanabilirsiniz.

 
Categories: Asp.net | Inceleme

January 20, 2008
@ 09:01 PM

İlk başlayanlar için zor sonrasında alışanlar için de sıkıcı gelen web.config dosyasını kolay birşekilde editleyeceğimiz güzel bir aracı sizlerle paylaşmak istedim. Kullanması çok kolay olan ASPhere çok güzel bir arayüz ile sıkıcı ve zor editleme işlemlerini eğlence haline getiriyor. Bakarsınız bilmediğimiz ayarları bile görebiliriz ;)

 


 
Categories: Asp.net

HttpHandler ile sunucuya gelen istekler üzerine işlemler yapabiliyoruz. Eğer belirli bir uzantı üzerinde işlem yapmak istersek ilk akla gelen HttpHandler yazıp uzantıya özel işlemlerimizi yapmaktır. Eğer aynı uzantıya göre birden fazla tanımlanmış HttpHandler'lardan birisinin çalışması istendiğinde (örneğin bir aspx sayfasına gelen isteğe göre birden fazla httphandler tanımlanmış olabilir) ise HttpHandlerFactory ile bunu kolayca halledebiliyoruz. (Factory Design Pattern 'in iyi bir örneği) Örneğin bir site yaptık http://hede/musteriler/x.aspx 'e bir istek geldiğinde ilgili HttpHandler'im, http://hede/urunler/z.aspx 'e bir istek geldiğinde ise birbaşka ilgili HttpHandler'in devreye girmesini isteyebiliriz.

Bu durumu incelemj  için aşağıdaki örneği inceleyebiliriz.

public class Customers : IHttpHandler
   {

       public bool IsReusable
       {
           get { return true; }
       }

       public void ProcessRequest(HttpContext context)
       {
           context.Response.Write("müşteriler sayfaları");
       }
   }
public class Products : IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("ürünler sayfaları");
        }
    }

 

Görüldüğü gibi iki adet httphandler'imiz var. Birisi müşteriler ile iglili aspx sayfaları üzerinde diğeri de ürünlerle ilgili sayfalar üzerinde işlem yapmak amacı ile tasarlanmış httphandler'larımız. Şimdi bizim işimiz gelen isteğe göre hangi httphandler'i devreye sokacağımıza karar vermek.Bu durumda yapacağımız bir IHttpHandlerFactory arayüzünü implemente etmiş sınıf hazırlamak. Örnek aşağıdaki gibidir.

public class facto : IHttpHandlerFactory
    {
        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            if (url.Contains("/musteriler/"))
                return new Customers();
            else if (url.Contains("/urunler/"))
                return new Products();
            else
                return new DefaultHttpHandler();
        }
        public void ReleaseHandler(IHttpHandler handler)
        {

        }
    }

Bu interface'i uygulamadığımızda iki metodu implemente etmemiz gerekecek. GetHandler metodu bir aspx (Web.config içinde gerekli ayarlamaların yapıldığını düşünerek) sayfasına istek geldiğinde ilgili HttpHandler'i oluşturup geriye bu nesneyi döndürmeye yarıyor.

Web.config dosyamızda aşağıdaki gibi HttpHandler'imizi eklemeliyiz.

<httpHandlers>
   <add path="*.aspx" type="hndLib.facto" verb="*"/>
</httpHandlers>
      
httphandlerfactory.rar (12,46 KB) (ilgili örnek ektedir)
 
Categories: Asp.net | Code | Inceleme

September 20, 2007
@ 11:12 PM

Küçük bir ayrıntı olmasına karşın kullanışlı bir özellik. Aşağıdaki kodu test ederken label'lara tıkladığınızda aralarındaki farkı anlayacaksınız. (AssociatedControlId özelliği verilmiş label'a tıkladığınızda textbox kontrolü focus'lanacaktır)

<asp:Label id="label" AssociatedControlId="textbox" Text="Ad" runat="server" /><asp:TextBox id="textbox" runat="server" /><br />

<asp:Label id="label1" Text="Soyad" runat="server" /><asp:TextBox id="textbox1" runat="server" />

Render işleminde sonra çıkan sonuç ise şöyle :

<label for="textbox" id="label">Ad</label>
<input name="textbox" type="text" id="textbox" /><br />
<span id="label1">Soyad</span>
<input name="textbox1" type="text" id="textbox1" />


 
Categories: Asp.net | Code

September 2, 2007
@ 09:38 PM

ASP.NET uygulamarınızda kullanıcılardan dosya transferi yapmak istediğimizde FileUpload Asp.net sunucu kontrolü ile basit bir şekilde bu işlemi hallederiz.Basit bir örnek ile

if (FileUpload1.HasFile)
{
   try
   {
      FileUpload1.SaveAs(Server.MapPath(".") + "/uploads/" + FileUpload1.FileName);
   }
   catch (Exception exp)
   {
      //hede höde
   }
}

Tabi dosyaları saklayacağınız dizine yazma hakkı (ASP.NET kullanıcısına) vermeliyiz. Buraya kadar herşey doğal gibi görünse de unuttuğumuz küçük! bir ayrıntı var ki o da dosya boyutu ve dosya tipi. Öncelikle istemediğimiz dosya tiplerinin sunucumuza upload edilmesini önlemeliyiz. Kullanıcıdan sunucuya gönderilen dosya tipini

Response.Write(FileUpload1.PostedFile.ContentType);
//bir txt dosyasını gönderdiğinizde tarayıcımızda "text/plain",bir mp3 dosyası göndediğimizde ise "audio/mpeg" yazdıgını göreceğiz.

kod satırı ile öğrenebilir ve istemediğimiz tipdeki dosyaların sunucuya gönderilmesini engelleyebiriz.Peki gelelim dosya büyüklüğüne. Bu basit hali ile uygulamamızı kullanıcılara açtığımızda beklenmedik bir durum ile karşılaşma ihtimalimiz çok yüksek. Örneğin iş başvurusu yapılacak ve kullanıcılardan CV lerini word dökümanı olarak istemekteyiz. ContentType ile dosya tipini belirleyerek başka formatlardaki dosyaları sunucumuza gönderilmesini engelledik. E güzel!. Dosya boyu 5 mb olan bir kullanıcı CV sini göndermeye çalıştığında ne olur ? Görünürde "ne olabilir ki?" dediğimizde aslında sunucumuz - iis - bu işlemi iptal edecek ve hatta yukardaki kod örneğinde catch bloğumuz işe yaramayacaktır. Olan olmuştur. Sunucu bir request'deki varsayılan büyüklük olan 4MB  sınırının aşıldığını tespit edecek ve bir hata oluşturacaktır (HttpUnhandledException). Peki Global.asax da biz bu hatayı yaklayıp inceleyelim.

Görüldüğü gibi yakalanan hatamızın InnerException nesnesine baktığımızda oluşturulan isteğin sınırı aştığını görebiliriz. Bu bizim için aslında dezavantajdan ziyada avantajdır.Çok büyük dosyalar yükleyerek sistemimizin yavaş çalışmasına neden olacak kötü niyetli arkaşlarımızı! birazcık üzecektir.  Çözüm ise sunucumuzun gelen isteklerin boyutunun 4MB den büyük olmasına izin vermesi. Bunu da web.config doyasını aşağıdaki gibi düzenleyerek sağlayabiliriz.

<httpRuntime maxRequestLength="16384"/>

Artık sunucumuz bu ayar ile maksimum istek boyutunu yaklaşık 16MB olarak kabul edecektir. Tabi burda dikkat etmemiz gereken en önemli nokta ise sunucumuzun bu uzun işlemler sırasında -16MB lik bir dosya kullanıcının bağlantısı yavaş olduğunu göz önüne alındığında yüklenmesi uzun bir işlem olacaktır - Normalde 90 sn boyunca gelen isteğe cevap veremezse IIS, isteği sonlandıracak ve timeout hatası gönderecektir. Bunu da engellemek için web.config dosyamızda aşağıdaki düzenlemeyi yaparız.

<httpRuntime maxRequestLength="20000" executionTimeout="360"/>

artık sunucumuz 90 sn değil 360 sn boyunca gelen isteği cevaplamak için "var gücü ile :) " çaba sarfedecektir ;) Tabi bu süreyi iyi analiz etmeli performans sorunları yaşamamak için bu sürenin uygulamanız çerçevesinde ne kadar süre olarak belirlenmesini iyi analiz etmek gerekir.


 
Categories: Asp.net

August 24, 2007
@ 10:43 PM
Beğenerek kullandığım DasBlog Asp.net 2.0 kullanılarak güncellenmiş. Yeni versiyonunu şurdan indirebilirsiniz. Şurdaki adresten kurulum yada benim gibi güncellemek isteyenler için gerekli bilgileri, şurdan da kurulumdan sonraki ayarların nasıl yapılacağı ile ilgili bilgiler edinebilirsiniz.

Bu arada yeni temayı çok beğendim :)


 
Categories: Asp.net | Internet

Validation kontrollerini kullanırken, çoğu zaman ErrorMessage özelliğinden yararlanırız. Ya ilgili kontrolün yanında "bu alanı boş geçemezsiniz, mail adresiniz yanlış" gibi uyarılar gösteririz ya da  "*" gibi bir karekter ile bu kontrole girilen bilgilerde hata olduğunu belirtmek isteriz. Ya da ValidationSummary ile hataları kullanıcının gözüne gözüne sokarız ;)

Bunların yanında yazıdan ziyada resim kullanarak da kullanıcıya bir hatanın olduğunu da belirtebiliriz. Örneğin, TextBox1 isimli kontrole mutlaka bir değer girilmesi gereksin;

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1"
ErrorMessage='<img src="ei.png">'></asp:RequiredFieldValidator><br />
<asp:Button ID="Button1" runat="server" Text="Button" />

Bu kodda altı çizgili yere dikkat ederseniz ErrorMessage bir yazı değil bir resim olarak belirtilmiş. Ve sonuç aşağıda ;


 
Categories: Asp.net

August 23, 2007
@ 05:02 PM

ASP.NET'te bir sayfadan diğer sayfaya verileri aktarmak için kullanılan yollardan birisi de bilindiği üzere Cross-Page Postback tekniğidir.

a.aspx sayfasından b.aspx Cross-Page Postback işlemi gerçekleştiğinde a.aspx sayfasına olduğu gibi b.aspx sayfasından erişebilinir.b.aspx sayfasında da PreviousPage özelliği ile a.aspx sayfasına erişiyoruz. a.aspx sayfasındaki herhangi bir kontrole de PreviousPage.FindControl("xx_id") ile erişiyoruz. Peki ya a.aspx deki herhangi bir Property'ye erişmek istersek ?

Eğer b.aspx'e sadece a.aspx den Cross-Page Postback işlemi ile gelindiğini düşünürsek b.aspx'e ;

<%@ PreviousPageType VirtualPath="~/a.aspx" %>

direktifini eklemeniz yeterli. Artık b.aspx.cs de PreviousPage özelliği size a.aspx sayfasını temsil ediyor olacaktır. örneğin;

public partial class a : System.Web.UI.Page
{
    //....

    private int _test;
    public int Test
    {
        get { return _test; }
        set { _test = value; }
    }

}

işte b.aspx sayfasından Test özelliğine direk erişiyor olabileceğiz.

public partial class b: System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (PreviousPage != null)
            Response.Write(PreviousPage.Test.ToString());
    }
}

Not : (a)PreviousPage tür dönüştürme işlemi ile de gerçekleştirebilirsiniz.
if (PreviousPage != null)

    Response.Write(((_Default)PreviousPage).Test.ToString());


 
Categories: Asp.net

VS.NET 2005 de bir Asp.Net  uygulamasını Ctr+F5 ya da F5 ile başlattığınızda sisteminizde öntanımlı - ki genellikle IE'dir ;) - tarayıcınız hangisi ise projeniz o tarayıcı ile başlatılır. Bazen test amaçlı olarak bazen de bilerek sitemimizde yüklü farklı tarayıcı ile Asp.net uygulamasının başlatılmasını isteyebilirsiniz. Gerekli adımlar:

-Öncelikle uygulamanızda Ctr+F5 ya da F5 'e basmak için kendinizi hazır hissedin :)
- File menüsünden "Browse With.."'i seçin...
- Add.. ile (ben Firefox u ekledim bile) istediğiniz bir tarayıcının yolunu bulup ekleyebilirsiniz ( eğer listede ie den başka tarayıcı yoksa)
-Set As Default ile seçtiğiniz bir tarayıcıyı öntanımlı hale getirebilirsiniz.
- Browse... ile de seçilen tarayıcıda uygulamanızı başlatabilirsiniz..

 


 
Categories: Asp.net

Blog'unu sıklıkla takip ettiğim - geliştirdiği blog'u kullanıyorum şu anda - derin bilgilerinden yazdıkları kadarı ile ;) istifade ettiğim Scott HANSELMAN iş değiştirmiş :) Yeni işi mi ? Microsoft için çalışacak bundan sonra. Bakalım ASP.NET ya da Web konusunda Microsoft ve bizler nasıl istifade edeceğiz bu değerli geliştiriciden. - kimilerine göre de pek iyi olmamış. Kendisini nerdeyse sitesine adayan Scott'dan artık eskisi kadar istifade edilemeyeceği korkusu var bazı kişilerde-  Konu ile ilgili yazısına gelen yorumların sayısına dikkat ederseniz ne kadar çok takipçisi olduğunu anlayabiliriz. Bu da blog'u.


 
Categories: Asp.net | Internet

July 22, 2007
@ 02:45 AM
Bir mail ile gelen soru üzerine verdiğim cevabımı buraya da yazayım dedim. Az çok - istesek de istemesek de - asp.net uygulamarında javascript kodları ile haşır neşir oluyoruz.
Şimdi çok basit bir örnek ile giriş yapalım. Bir aspx sayfası bir button ve bir textbox. Button'a tıklağımızda textbox'a birşey yazsın istiyoruz.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function Yaz()
{
var txt = document.getElementById('txt');
txt.value = "BT Akademi";
}

</script>
</head>
<body>
<form id="form1" runat="server">
<input id="Button1" type="button" value="button" onclick="Yaz()" />
<asp:TextBox ID="txt" runat="server"></asp:TextBox>
</form>
</body>
</html>

Görüldüğü gibi zor bir tarafı yok daha önce ilgilenenler için. getElementById javascript fonksiyonuna butona tıklandığında içerisine "BT Akademi" yazmasını istediğimiz kontrolümüzün ( dikkat edin bu kontrol asp.net webserver kontrolü) ID'sini veriyoruz.Şimdi ise aynı olayı bir User Control içersinde gerçekleştirelim. Öncelikle çok basit bir user kontrol oluşturacağız ve bunu asp.net sayfamıza ekleyeceğiz. Bakalım neler oluyor.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucTest.ascx.cs" Inherits="ucTest" %>
<script type="text/javascript">
function Yaz()
{
var txt = document.getElementById('ucTxt');
txt.value = "BT Akademi";
}

</script>

<asp:TextBox ID="ucTxt" runat="server"></asp:TextBox>
<br />
<input id="ucBtn" type="button" value="Uc Tıkla" onclick="Yaz()" />

Dikkat ediniz. Yukardaki kodlar ucTest isimli user kontrolümüzün kodlarıdır.Bu user kontrolü asp.net sayfasına ekleyip sayfamızı çalıştırdığımızda hata alacağız. Nedeni ise: Javascipt kodumuza baktığımızda direk ucTxt yazdığımızı fark edeceksiniz. Bu user kontrol render edildiğinde html çıktısına bakacak olursak bizim ucTxt Textbox kontrolümüzün adının "UcTest1_ucTxt" şekline dönüştürüldüğünü yani ,ilk olarak user kontrolünün adı (UcTest1) , araya "_" eklenmiş ve sonra da  kontrolün adı (ucTxt) eklenmiştir. Oysaki biz javascript kodunda kontrolümüzün adını "ucTxt" olarak belirtmiştik. Şimdi hatamızın kaynağını bulduk. Çözüm :

1- javascipt kodunu bu bilgiler ışığında şu şekilde güncelleyebiliriz.

var txt = document.getElementById('UcTest1_ucTxt');

Pek iyi bir fikir değil gibi. Çözüm müdür? Evet. Ama kontrolümüzün ismi değiştiğinde gidip js kodları ile de oynamak gerekiyor.

2- En iyisi biz bu oluşacak yeni ismi küçük bir kod ile asp.net ten alalım ve js kodumuz ile bir daha hiç uğraşmayalım...user kontrol eklendiğinde
ilgili kontrolün ismini hiç düşünmeyelim ve kendisinden alalım. İşte asp.net webserver kontrolümüzün ClientID özelliği sayfa render edildikten sonra kontrolün clientdaki id sini bize verecektir.Son olarak js kodunu aşağıdaki gibi değiştirirsek sorun hallolacaktır.

<script type="text/javascript">
function Yaz()
{
var txt = document.getElementById('<%=ucTxt.ClientID %>');
txt.value = "BT Akademi";
}
</script>


Örnek uygulamayı indirebilirsiniz WebSite4.zip (2,34 KB)

 
Categories: Asp.net | Code | Inceleme

July 20, 2007
@ 09:43 PM

Selamlar,

Uzun zamandır blog'umla ilgilenemiyorum. Gerek özel yaşantıdaki gelişmeler, gerek iş konusundaki yoğun bir çalışma dönemine ekip olarak girmiş olmamız - bekleyin güzel bir süpriz geliyor!!! - blog için zaman ayırmaya engel oldu. Aslında özeleştiri yapacak olursam, sanki blog en son düşünülecek, en son zaman ayrılması gereken çalışma gibi geliyormuş gibi davranmam hoşuma gitmedi. Aslında işleri önem derecesine göre sıraya sokacak olursa ilk 3 de blog için yazı yazmak yer almalı. Umarım kendi özeleştirimi kendim dikkate alırım bundan sonra:)

Hemen elime geçen programlarımızla ilgili resimlere çok çok geçte kalmış olsam burda yer vereyim.

Sevgili arkadaşlar, her nekadar "hocam, şunu da anlatın, hocam bu nasıl, bunu da isteriz" gibi konu dışı istekleriniz ile kursu 1 hafta daha uzatmış olmanıza rağmen güzel bir program geçirdiğimi belirtmek isterim. Hele de program sonunda 2 3 arkadaşımızın projelerini görünce hem kendi adıma sevindim hem de eğitimin başarılı bir şekilde geçtiğine daha da kanaat ettim. Umarım iş hayatınızda daha da başarılı olursunuz.

 

  
 
Categories: Asp.net | Yasam

May 10, 2007
@ 12:06 AM

PostBackUrl özelliğine -property- herhangi bir sayfa linki verdiğinizde diğer sayfa aynı pencere içinde açılacaktır. Eğer yeni sayfa başka bir pencere açılmasını istiyorsanız post işlemi yaptığınız sayfaya aşağıdaki kodu yazmanız yeterli.

Page.Form.Target = "_blank";


 
Categories: Asp.net

Bitmiyor...Bitmiyor... gelişmeler bitmiyor. İşte bitanesi daha. Web uygulamaları geliştirenler için istemciler ile data arasında URI tabanlı iletişim kuran kütüphane.

Efendim hadise şuymuş ; Silverlight ( güzel bir açıklama için bu linke bir gözatın), Flash gibi araçlar ile istemci tarafında etkili arayüzler sağlayabiliyormuşuz.Ama bu arayüzler ile datalara erişlemiyormuşuz. Ajax gibi teknolojiler ile erişiyormuşuz da işte render idi şuydu buydu tam istediğimiz olmuyormuş. Napacakmışız özel URI'ler ile data tarafına istekde bulunarak XML dosyaları şeklinde dataları alıp client tarafında işleri halledecekmişiz. Misal;

http://myserver/data.svc/Customers dediğimiz de Northwind deki Customers dataları gelecekmiş.. Yok ben where ile şart koşmak istiyorum derseniz http://myserver/data.svc/Customers[ALFKI] diyecekmişiz. Olmadı kardeşim Orders ile de bir ilişki kurmak lazım diyorsanız http://myserver/data.svc/Customers[ALFKI]/Orders buyrun :) Yetmedi mi ? http://myserver/data.svc/Customers[ALFKI]/Orders[Active eq true] işte bi tane daha... Hoppala nerde bunun order by'ı diyenler için http://myserver/data.svc/Customers[ALFKI]/Orders[Active eq true]?$orderby=OrderDate işte bir imkan daha... Bunların yanında da sayfalama yapmak isteyenler için bedava olarak şu şekilde bir URI mevcut : http://myserver/data.svc/Customers?$skip=30&$take=10 

http://myserver/data.svc/Customers[ALFKI] gibi  sorgu sonucunda da aşağıdaki gibi XML sonucları elde ediliyor.

<DataService xml:base="http://myserver/data.svc">

 <Customers>

  <Customer uri="Customers[ALFKI]">

   <CustomerID>ALFKI</CustomerID>

   <CompanyName>Alfreds Futterkiste</CompanyName>

   <ContactName>Maria Anders</ContactName>

   <ContactTitle>Sales Representative</ContactTitle>

   <Address>Obere Str. 57</Address>

   <City>Berlin</City>

   <Region />

   <PostalCode>12209</PostalCode>

   <Country>Germany</Country>

   <Phone>030-0074321</Phone>

   <Fax>030-0076545</Fax>

   <Orders href="Customers[ALFKI]/Orders" />

  </Customer>

 </Customers>
</DataService>

Henüz CTP aşamasında olan bu proje hakkında detaylı bilgiyi burdaki linkten edinebilirsiniz.

 


 
Categories: .NET | Asp.net | Inceleme

İçerğin yoğun olduğu aspx sayfalarda scroll ile sayfanın aşağılarına inip bir post işlemi gerçekleştirdiğinizde postback işleminden sonra kendinizi sayfanın başında bulacaksınız. Oysaki ben tekrar post işleminin yapıldığı yere sayfayının pozisyonunu ayarlamasını isterim. O zaman yapılacak şey Page direktifine gidip MaintainScrollPositionOnPostback özelliğini (attribute) eklemektir.

<%@ Page Language="C#" AutoEventWireup="true" MaintainScrollPositionOnPostback="true" CodeFile="..." Inherits="..." %>

Windows uygulamarında Enter'a bastığımızda (AcceptButton) nerde olursak olalım belirli bir butona tıklanmış gibi işlem yapabiliyoruz. Peki ASP.NET'te bunu sağlarız. Yapacağımız form tagına gidip DefaultButton özelliğini eklemek olacaktır.

<form id="form1" defaultbutton="Button1" runat="server">

Bazen de sayfa yüklendiğinde sayfadaki belirli bir kontrolün aktif olmasını isteyebiliriz. Örneğin bir login sayfasını düşünelim. Sayfa yüklendiğinde imlecimizin kullanıcı adı girişi yapılacak textbox'un içinde olmasını isteriz. Ya da sayfa yüklendiğinde belirli bir butonun seçili olamasını sağlamak isteyebiliriz. Bu durumda form tagına gidip defaultfocus propertisini eklemek olacaktır.

<form id="form1" defaultfocus="TextBox1" defaultbutton="Button1" runat="server">


 
Categories: Asp.net

April 16, 2007
@ 11:10 PM

ASP.NET için daha detaylı exception nesnemizin küçük bir kullanım örneği :

//Global.asax
void Application_Error(object sender, EventArgs e)
{
    Response.Write("hata Kodu : " + (Server.GetLastError() as HttpException).GetHttpCode());
    Response.End();
}

Böylelikle o sarı kırmızı çirkin hata ekranından kurtardık.
Respons.End() metodu tüm tampondaki tüm içeriğin gönderilmesini sağlar ve ReguestEnd eventini gerçekleştirir.

Response.StatusCode = (Server.GetLastError() as HttpException).GetHttpCode();

ile de sayfanın hata kodunu set edebilirsiniz (404 ; sayfa bulunamadı, 500 ; çalıştırılmak istenen kodlar patladı vs vs gibi )
 
Categories: Asp.net

Bazen bir aspx sayfasının çıktısı üzerinde işlemler yapmak isteyebilirisiniz. Örneğin sayfadaki yasaklı kelimelerin - genelde forumlarda ihtiyaç duyulur :)  - düzenlenmesi, ya da bazı bilindik kelimeler üzerinde işlem yapmak isteyebiliriz. Mesela ben sayfamda BT Akademi ve oğuz kelimelerine rastladığımda ilgili kelimelerin yerine sanki linki verilmiş gibi yer almasını isteyebilirim. Bu durumda yapmamız gereken çıktının - Response - Filter özelliğinden yararlanmak. Filter özelliğini - property- incelediğimizde aslında bunun bir Stream nesnesi olduğunu görürüz. Bu durumda yapmamız gereken görüntülenmesini istediğimiz çıktıyı kendimiz oluşturmak. Bunu da kendi Filter - aslında Stream'dan türemiş bir class oluşturmak - nesnemizi oluşturup Response.Filter özelliğine bu kendi nesnemizi vermekten ibaret.

Stream sınıfı abstract bir class olduğundan abstract - özet kelimesini pek sevmesem de Türkçe'de başka kelime anlamını tam veremiyor- olarak bildirilmiş metodlarını kendi sınıfımızda uygulamamız - implement - gerekiyor. Bunları ekteki dosyadan inceleyebilirsiniz. Asıl üzerinde durulması gereken konu ise bu oluşturduğumuz sınıfın Write(...) metodu. Bu metod içinde sayfamızda görünmesini istediğimiz çıktıyı kendimizin oluşturması. Örneğimizi incelersek

class AFilter:Stream
{

     Stream _originalStream = null;

     public AFilter(Stream ResponseFilter)
     {
         _originalStream = ResponseFilter;
     }

     ...........

     ...........

     public override void Write(byte[] buffer, int offset, int count)
     {
         string text = Encoding.UTF8.GetString(buffer);

         //Regex de kullanılabilir...
         text = text.Replace("oğuz", "<a href=http://www.oguzyagmur.com>oguz</a>");
         text = text.Replace("BT Akademi", "<a href=http://www.btakademi.com>BT Akademi</a>");

         // istenilen ek işlemler yapılabilir.
         text = text.Replace("\r\n", "");

         //eklemeler yapılabilir cıktıya...
         text += "<br>tüm hakkı saklı falan değildir. tepe tepe kullanın";
 
         buffer = Encoding.UTF8.GetBytes(text);
        _originalStream.Write(buffer, 0, buffer.Length);
     }
}

Write metodunda sayfaya çıktı gönderilmeden önce çıktıyı alıp üzerinden işlemler yapıp daha sonra çıktıyı sayfaya gönderiyorum. Bu sınıf oluşturdukdan sonra yapmamız gereken sayfanın OnPreInit metodunda hazırlamış olduğumuz bu filitrenin sayfa çıktısı üzerine uygulanmasını sağlamak.

protected override void OnPreInit(EventArgs e)
{
    Response.Filter = new AFilter(Response.Filter);
}

Bu durumda sitedeki her sayfa için bu işlemi tekrarlamak olacaktır ki çok da iyi bir yöntem değil. Belki MyCustomPage isimli Page den türemiş olan bir sınıf oluşturup tüm sayfalarımızı bu - MyCustomPage - sayfadan türeterek bir nevi çözüm geliştirsek de  -sizin çok daha iyi fikriniz olabilir - size önerim bu işi üstlenecek bir HttpModule hazırlamanız olacaktır.

Burda da ilk akla gelen soru hazırlamış olduğum bu filitreyi HttpModule de hangi event'te sayfanın çıktısına uygulamak. msdn'i biraz kurcaladığımda sayfanın çıktısı üzerine filitre ReleaseRequestState eventi sırasında uygulandığını öğrendim. Bu durumda aşağıdaki kısacık kod ile sitemizdeki tüm sayfalar üzerinde hazırladığımız bu filitreyi etkin kılabiliriz.

public class HrefFilter : IHttpModule
{

     public void Dispose()
     {
     }

     public void Init(HttpApplication context)
     {
         context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
     }

     void context_ReleaseRequestState(object sender, EventArgs e)
     {
         if (HttpContext.Current.Response.ContentType == "text/html")
         {
              HttpContext.Current.Response.Filter = new AFilter(HttpContext.Current.Response.Filter);
         }
     }
}


filter_dosyalar.rar (24.57 KB)
 
Categories: Asp.net

Diyelim ki VB.NET ile geliştirilen bir web projesine sonradan dahil oldunuz ya da zamanında VB.NET ile yazılmış bir proje var sizin C# ile geliştirdiğiniz projeye dahil etmek istiyorsunuz. Bu şekildeki bir senaryoda projenizde 2 farklı dil kullanılıyor olacak. Peki gittik hem *.vb dosyalarını hem de *.cs dosyalarını projemize ekledik. Build ettiğimiz de *.vb and *.cs' use a different language, which is not allowed since they need to be compiled together gibi bir error alacağız. Bunu engellemek için ;

App_Code klasörüne (yoksa eklenmesi gerekiyor) csKodlari - tamamen baska isim verebilirsiniz - , vbKodlari isimli iki yeni klasör oluşturup *.cs kod dosyalarını csKodlari, *.vb kod dosyalarını da vbKodlari klasörlerine koymak gerekiyor. Web.config dosyasına da VB.NET ve C# kod dosyalarımızın hangi dizinlerde olduğuna dair eklemelerde bulunmalıyız.

<system.web>

<compilation debug="true">
    <codeSubDirectories>
        <add directoryName="csKodlari"/>
        <add directoryName="vbKodlari"/>
    </codeSubDirectories>
</compilation>

Dikkat edin <compilation> zaten web.config de ekli. Siz de eklerseniz Build aşamasında error olacaksınız.
Eğer yapılan işlemlerde bir hata yoksa uygulamanızdaki VB.NET kodlarını herhangi bir aspx (Default.aspx.cs de kullanıldığına dikkat ediniz.) sayfasının kod kısmında rahatlıkla sanki C# ile yazılmış gibi kullanabilirsiniz.


 
Categories: Asp.net

ASP.NET Uygulamalarında Javascript kullanan web geliştiricileri için  bu linkte javascript kodlarının VS.NET 2005 ile nasıl debug edileceği gayet güzel açıklanmış.


 
Categories: Asp.net

January 16, 2007
@ 12:47 PM

Sevgili Sefer Algan yine bir ilke imza atıp geniş içerikli bir ASP.NET AJAX Programı düzenliyor. Öğrencilerden en çok soru gelen ve merak edilen bu konuda zengin program içeriği ile Sefer Algan deneyim ve bilgilerini bizlerle paylaşacak .


Eğitim hakkında detaylı bilgiyi buradan bulabilirsiniz.



 
Categories: Asp.net

Eğer siz de "şu viewstate içinde neler var acaba" diyenlerdenseniz şu adresdeki uygulama tam size göre. ie'ye bir eklenti şeklinde yerleşen uygulama ayrıntılı bir şekilde aspx sayflarındaki viewstate'i incelemenizi sağlayor..



 
Categories: Asp.net

August 3, 2006
@ 12:00 AM

ASP.NET ile yeni tanışan birçok web uygulaması geliştiricisi ViewState kavramına soğuk bakar ya da pek anlam veremez. Anladıkdan sonra çok yer tutuyor, ağ tarafiğini artırıyor gibi serzenişler sergilerler.Bu makalede ASP.NET 2.0 da ViewState kavramına çok güzel bir şekilde değinilmiş aynı zamanda ASP.NET 1.1 e nazaran 2.0 daki iyileştirilmelerden bahsedilmiş. En önemlisi de çalışma mekanizması çok güzel bir şekilde açıklanarak arka planda neler olduğunu,mekanizmanın nasıl işlediği sade bir şekilde anlatılarak perfotman konusunda geliştiricilerin dikkat etmesi gereken noktalar belirtilmiş. Okumakta yarar var.


 
Categories: Asp.net