Hoşgeldin Misafir

Kod ASP.Net Web User Kontrolü

LikeForYou

26 Eyl 2017
728 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Bu yazımızda hep birlikte Web User Controlleri öğreneceğiz ve yine hep birlikte bunlar ile ilgili bir kaç örnek yapacağız. Örneklerin yanı sıra yarattığımız bu Controller için Event tanımlama, design time property ayarlanmasını goreceğiz. Fazla örnek yapabileceğimizi sanmıyorum, zira bu konunun çok uzun olacağını tahmin ediyorum.

Web Custom Controller ve Web User Controller aslında aynı işi yaparlar. Yani hazırladığımız bir templete i component biçiminde eklememizi sağlarlar. Bu tanımlama çok çok kaba olduğu halde en azından haklarında bir fikir vermesi için kullandığım ve hataları olan bir tanımlama. ޞimdi dilerseniz kitap tarifleri diyebileceğimiz tanımlamalarını yazalım ...

Web User Control :
Daha daha önceden varolan bazı sunucu ve HTML componentlerini kullanarak yeni bir görünüş yapmamıza faydalarç Bunu VSçNET ile yapabilrsiniz. Yaptığımız bu controller .ascx dosyalarında saklanır ve nerede kullanmak istiyorsak orada sayfaya import etmemiz gereklidir.
Web Custom Control : 2 biçimde kısacasımemiz mümkün. Ve bunlar bir dahaki hafta anlatılacaktırlar.

Bunlar Composite Custom Controller ve Rendered Custom Controllerdir.

1 - Composite Custom Controller : İsmininden de anlaşılacağı gibi(ingilizce bilenler için) composite yani birleştirilmiş componentlerdir. Yani önceden var olan bazı sunucu ve HTML componentleri kullanarak yeni bir görünüm yaratmak için oluşturulan componentlerdir.

2 - Rendered Custom Controller : Yani HTML yazılarak ortaya menfaatilan yeni componentlerdir. Ilkinden farkı direk HTML yazılması temeline dayanmasıdırç İlkinde ki gibi önceden varolan componentleri kullanmak yerine direk HML output biçiminde yapılmasıdır.

1 - WEB USER CONTROL :
Web User Controlleri bir nevi ASP deki include filelar gibi düşünebilirsiniz. Oluşturduğunuz bir Web User Controlü sayfanızın talebiniz yerine koyar ve orada onun görünmesini sağlayabilirsiniz. Tabii bunu yaparken ASP deki gibi include tarzı bir deyim kullanmayız. Onun yerine Prefix tanımlaması yaparız. Neyse fazla aceleci davranmadan basmak basmak konumuzu prosedüreye başlayalım.

1.1 Özellikleri :
Web user controller proje içerisinde yaratılan ascx dosyalarıdır. Bu dosyalar içerisinde önceden var olan HTML ve sunucu componentlerini istediğimiz gibi kullanarak yeni bir görünüm oluştururuz. Web USer Controller kullanıldıkları her proje içerisinde kesinlikle bulunmalıdırlar. Bunun nendeni ise onları compile edememizdir. Yani Web User Controlleri derleyerek bir dll yapıp bunu istediğimiz projede kullanam imkânımız yoktur. Sadece asp deki include dosyaları gibi kullanmak mümkünler. User Controller VS.NET toolbox ında yani araç çubuğunda bulunmazlar. Onları herhangi bir projeye eklemek için Solution Explorer dan o ascx dosyasını tutarak sayfada istediğiniz yere bırakmanız gereklidir. USer Control kodları ise Web Formumuz Load edildikten sonra yüklenir. Bu şu demektir. Page_Load eventi User Controlümüzün yuklenmesinden önce gerçekleşmektedir. Bu sayade gerekli loadingleri o kısımda yapabiliriz. Bu saydıkarım .NET teki diğer componentlerde olmayan özelliklerdir. Bu nendenle ne olursa olsun Web User Controlleri .NET in diğer kontrollerine benzetmeyiniz. (örn. Windows Controller ve Web Custom Controller gibi ...)

1.2 Yeni bir Web User Control Oluşturma
VS.NET editöründe Solution Explorer da projeye sağ kliklayınız ve Add New Item opsiyonuni seçin. Buarad açılan pencereden Web USer Controlü seçip yeni adını verin ve okey deyin. Bolelikle yeni bir ascx dosyası Projenize eklenmiş olacaktır. ޞimdi peki ne yapacağız.

Yapacağımız şey bu controlun içinde barındırmasını istediğimiz biçimde tasarlamak. Örneğin sizin bir menünüz var ve bu menü aşağı yukarı her sayfanızda kullanılıyor. Ve bu menude bazı durumlarda değişiklikler yapmanız gerekecek bu durumda her sayfada bu işi ayrı ayrı yapmak yerine tek bir menü sayfası oluşturup bunu her sayfada kullanamk daha mantıklı olacaktır.

ޞimdi bu menu örneği hakkında hemen şu şekilde bir şey yapabiliriz. Bir ascx dosyası olusturup bu dosyanın içeriine menu kodumuzu yazarız. Örneğin:


<table cellpadding=0 cellspacing = 0 border=0 class=yazi>
<tr>
<td><a href="">Link 1</a></td>
</tr>
<tr>
<td><a href="">Link 2</a></td>
</tr>
</table>



gibi bir kodu bu sayfamıza yazarız. Daha sonra yapmamız gereken tek şey bunu drag drop la yani tutup bırakma ile rastgeleb ir sayfamızın istediğimiz yerine koyma şansımız olacaktır. Böylece bu dosyada yapacağımız bir değişiklik diğer yüm sayfalarıda etkileyecektir. Tabii bu çok kolay bir örnek oldu ve yalnızca asp de kullandığımız mantığın benzerini kullandık ve birde sadeec HTML kullandık. ޞimdi daha karmaşık bir örnek yapalım. Örneğin yeni bir Web User Control dosyası oluşturalım ve buna Login.ascx adını verelim. Bu dosya içeriinede bir login form koyalım. Bunun için şöyle kod yazmamız yeterlidir.


<DIV id=maxilogin align=center>
Kullanıcı Adı : <asp:TextBox id=username Runat="sunucu"/><asp:TextBox>
ޞifre : <asp:TextBox id=passWord Runat="sunucu"></asp:TextBox>
<asp:Button id=login Runat="sunucu" Text="GIR"></asp:Button><br>
<asp:Label id=sonuc runat=sunucu></asp:Label>
</DIV>



Buarada elimizde iki textboxımız var ve bunların birisi kullanıcı adı ve diğeride şifre için ve birde düğmesimuz var. Bu bize kolay bir kullanıcı adı ve şifre isteyen form örneği.

1.3 Web User Control Methodları, Eventleri ve Property lerini ayarlama
ޞimdi buraya kadar kolay bir login form taşıyan bir User Control yaptık. Bu denetimimüz şu anda bile kullanılmaya hazır ancak biz işleri biraz daha ileri ***ürüp işimize daha fazla yarayacak hale getireceğiz. Bunun içinde methıdları eventleri ve propertyleri kullanacağız. İşe dilerseniz propertylei ile başlayalım. Hepiniz bilirsiniz herhangi bir denetimi internet formumuza eklediğimizde yanda property dialoğunda onun propertyleri çıkar. Mesela asp:button için Text, Runat gibi birçok property çıkar. ޞimdi bizim bu denetimimüz içinde gerekli property ayarlamaları yapacağız. Bu propetyler bize design esnasında ve RunTimeda birçok basitlık sağlayacak. Aynı zmanda tek kalıp değilde farklı bir görünüm yada kullanım için gerekmektedir.

ޞimdi oluşturduğumuz bu Web User Control ün code görünümüde (C# ya da VB.NET) bakalım. Ben herzamnki gibi yalnızca C# kullanımını göstereceğim. VB.NET kullanmak isteyen arkadaşlar kendileri bu kodları uyarlasınlar.

Controlümüzün classına dikkat edecek olursak şöyle kaydedilmiş olduğunu farkederiz

public abstract class Login : System.Web.UI.UserControl



ޞimdi bunun neresine dikkat edeceğiz ki diyeceksiniz. Birincisi clasımızın bir abstract class olması. Bu şu demektir. User Controller classı yalnızca bu ortaya cıkan yeni class için yani Web Forma koyacağımız controlümüz için temel yani Base classdır. Bir diğer önemli nokta ise : System.Web.UI.UserControl kısmıdır ki buda bu yeni oluşturduğumuz controlümüz System.Web.UI.UserControl namespace ini temel alır. Yani yeni controlümüzü yaratmakta kullanacağımız ve yine HTML atrribularından propertylerini alacağımız temel methodlar ve property ler bu classda bulunur.

Yukarıdakiler haricinde code görünümde birde Page_Load eventini göreceğiz ki hatırlayalım bu event Windows Formsun Page_Loisminden deha sonra gercekleşecektir...

ޞimdi bu code ların arasına kendi propertylerimizi yazalım. Tabii bunu yaparken dikkat etmemiz gereken husular var. Bunlar; propertyleri public olarak tanımlayalım ki dışarıdan erişime izin verilsin. Ve yine design time da yani VS.NET te bu componentin propertyleri değiştğinde bunları yeni dşayetlerinin saklı tuulması ve buna göre görünümün tekrar oluşturulması için ise ViewState deyimini kullanmak. ޞimdi yukarıyada yaptığımız örnek için hemen bir property tanımlaması yapalım. Bu property miz mesela SiteAdi olsun. Ve burada hangi sitede kullanıyorsak o ayarlansın.


public string SiteAdi
{
get {return Convert.ToString(ViewState["SiteAdi"]);}
set {ViewState["SiteAdi"] = value;}
}



Buarada KullaniciAdi isimli bır property tanımladık. ޞimdi nedir bu ViewState katdeşim deme hakkınız varmı yok mu? Bence var. View State bir dictinory dir ve içerisine yazdığınız key e bağlı olarak içeriisnde o controlünüz için gerekli propertyleri tutar. Örneğin burada biz SiteAdi diye bır property tanımladık ve bunun dşayetinide ViewState te yine "SiteAdi" keyini kullanarak tuttuk. Bu sayede bu oluşturduğumuz controlün propertyleri ViewState te tutulur. Daha sonra istediğimiz herhangi bir anda onu kullanırız.

Bu property benim ne işime yarayacak diyorsunuz aslında bu örnekte pek olağan üstü kullanımları olamayacak ancak yinede kullanacağız. Ancak siz ileride işinize daha fazla yarayan hatta hayati önem taşıyan propertyler kullanmak zorunda kalacaksınız ... Buna garanti verebilirim ...
Propertyleri bu yolla tanımladığımıza göre şimdi sıra Eventlerimizi kullanamaya geldi. Yukaridaki örnekte koydugumuz düğmea çift tıklayın ve oluşan evetin içerisine şu kodları yazalım..


private **** Button1_Click(object sender, System.EventArgs e)
{
if(this.username.Text != "kuti" || this.passWord.Text != "kuti")
{
this.Label1.Text = "Hata VAR";
} else{
this.KullaniciAdi = username.Text;
this.Label1.Text = "Merhaba " + this.username.Text + ". " + this.SiteAdi + " sitesine güzel geldiniz.";
}
}



burada da görüldüğü gibi gelen username ve passWordu yani kullanıcı adını ve şifreyi kontrol ediyoruz ve şayet ikiside kuti değilse demekki hatalı diyoruz ve Labelımıza hata var yazdırıyoruz. Eğer username ve şifre doğru ise bu kez ismi ile hitap ederke merhaba kuti diyerek Property olarak yaptığımız SiteAdi ni kullanarak şu siteye güzelgeldiniz diyoruz. Bütün bunları düğmea clicklendiğinde yapıyoruz. ޞidmi buraya kadar nasıl yazılacağı ve nasıl kullanılacağına bir örnekleme yaptık Web User Controlleri için. ޞimdi bu örneğimizi herhangi bir Web Forma nasıl adapte edeceğiz yada Propertyleri nasıl ayarlayacağız ona bakalım dilerseniz.

Herhangi bir User Controlü kullanabilemek için sayfanıza Register edilmesi gerekir. Bunun için bu Web User Controlü tutup sayfada kullanmak istediğiniz yere bırakmanız yeterli olacaktır. VS.NET sisizn yerinize Register prosedürünü yapacaktır. Ama siz manuel yani elle kendiniz yamk dilerseniz ozman kodu kendiniz yazmalısınız. Register kodu aşağıdaki gibi dir.


<%@ Register TagPrefix="KUTI" TagName="Login" Src="Login.ascx" % >


Buarada KUTI sayfadaki Prefix idir. Tagname ise bunun için kullanılacak isim ve son olarakda kaynak dosyası yanı ascx dosyamız verilmektedir.
ޞimdi buna göre sayfamızda bunu şöyle kullanabiliriz..


<KUTI:Login Runat="Server" id="Login1" SiteAdi="maxiasp.net"></KUTI:Login>



Buarada yontem şu ;

<TagPrefix:TagName .... Propertyler ... ve son.

Default TagPrefic uc1 seklinddir. Yani siz drag dropla sayfaya bıraktığınızda default olarak kendisi uc1 diye bir TagPrefic oluşturur.

ޞimdi bu sayfa çalışırsa ortaya şöle bir şey çıkar. Eğer kullanıcı adı ve şifre kuti olarak girilmezse alttaki Labela HATA VARRRRRR... yazdırır. Eğer doru girerse o takdirde de Merhaba kuti maxiasp.net e güzelgeldiniz yazacaktır.

ޞimdi dilerseniz Event yapalım. Yani bu denetimimüz için bir event tanımlayalım. ޞidmi bildiğiniz gibi Eventlerin Argumalnları vardır. Bu arguman event sonucu taşınmasını istediğimiz degerleirn oluşturduğu objedir. Bizde bu controlümüz için bir event yapalım ve bu event login eventi olsun. Yani kullanıcı doğru şifre kullanıcı adı yazrsa bu eventimiz oluşsun ve taşıyacağı argumanlarda kullanıcı adı ve şifre olsun.

Önce bir argüman clası tanımlayalım...


public class Login_EventArgs
{
private string _Kullanici = "";
private string _Sifre = "";

public string Kullanici
{
get {return _Kullanici;}
}

public string Sifre 
{
get {return _Sifre;}
}

public Login_EventArgs(strıng kullanici, string sifre)
{
_Kullanici = kullanici;
_Sifre = sifre;
}
}



Bu arada siz burada dilerseniz böyle bir class yaratıp argumanları bunla taşımak yerine (eger arguman tasımayacksanız) System.EventArgs classını kullanabilrisiniz...

ޞimdi sıra bu eventi yakalacak handlerı tanımlamakta. Onuda şöyle yapabiliriz.

public delegate **** LoginEventHandler(object sender, Login_EventArgs e);



burada delegate i yapıyoruz ve bu delegate in taşıyacağı dşayetleri belirtiyoruz.

ޞimdi codumuzun içerisine yani yukarıyada yaptığımız örnek kodun içerisine event tanımlama prosedürünü yapalım..

public event LoginEventHandler Login = null;



şimdi oluşturduğumuz bu Login eventini ortaya çıkarmamız gerekecek....


private **** Button1_Click(object sender, System.EventArgs e)
{
if(this.username.Text != "kuti" || this.passWord.Text != "kuti")
{
this.Label1.Text = "Hata VAR";
} else{
if(this.Login != null)
{
Login_EventArgs arg = new LoginEventArgs(username.Text, passWord.Text);
this.Login(this, arg);
}
}
}



Burada Login eventini ortaya menfaatiyoruz. ޞimdi burada dikat ederseniz Login eventini null yaptım tanımlarken ve daha sonrada ortaya çıkarma esnasında kontrol ettim şayet null sa hiç bir prosedür yapma diye. Bunun nedeni şayet event kullaılmak istenmiyorsa yani hernagi bir functiona atanmamısaprosedür yapmamak. ޞimdi buraya kadar heralde anladık. Sıra geldi bu eventi kodumuzda yani Web Formumuzun kodunda yakalama...

ޞidmi bunun için önce Web Formumuzda bu event oluştuğunda hangi function çağrılacaksa o oluşturulmalı.


private **** Login_LoginEvent(object sender, Login_EventArgs e)
{
Response.Write("Merhaba " + e.Kullanici);
}



ޞimdi ilk önce dikkat ederseniz functıonım delegate ettiğim LoginEventHAndlerı ile aynı yapada...

Buaradada Response.Write kullanılarak yazdırıyoruz merhabayı.

ޞidmi son basmak bu eventi atamak, onu da Windows formumuzda yapacağız yine..

Hatırlarsnız Controlümüzün adı Login1 di sayfamızda.


Login1.Login += new LoginEventHandler(this.Login_LoginEvent);
// burada Login eventi olustugunda direk Login_LoginEvent functinına yonlendirdik ...



Onun Login eventinide bu yolla tamamlamış olduk.