Master Page Kavvramı Gönderen: FetihlerFatihi Tarih: 03 January 2008 22:31:32
Notice: Undefined index: current_action in
/home/del10000/domains/delphidunyasi.net/public_html/Sources/Subs.php on line
2391
Master Page uygulamasına sahip bir asp.net uygulamasına başlamak için File > New > Other menü seçeneği ile aşağıdaki pencereye ulaşıyoruz.

Açık uygulama için yeni bir MasterPage ya da MasterPage destekli aspx sayfası oluşturmak için başlamak için File > New > Other menü seçeneği ile aşağıdaki pencereye ulaşıyoruz.

Pencereyi ok’lediğinizde bir pencere çıkar ve sayfanın ismini belirlemenizi ister. Master Page destekli sayfa eklediğinizde aşağıdaki gibi bir pencere ile sayfanın hangi masterpagee’e ait olduğunu da belirtiyoruz.

Bu aşamadan itibaren yazılanlar
csharpnedir.com sitesinde C# için yazılan makaleden Delphi’ye uyarlanmıştır.
---
Asp.Net 2.0 ile birlikte gelen en önemli yeniliklerden biriside Master Page kavramıdır. Master Page kavramını ilk öğrendiğimde aklımda oluşan tanımlama şöyleydi; "bir sitedeki sayfalarının tamamının yada bir kısmının aynı şablon üzerinde oturmasını sağlamak istiyorsak Master Page’ lerden faydalanabiliriz". Oysaki Master Page kullanımı ile elde edilen avantajlar sadece görsel açıdan gelen bu kolaylık ile sınırlı değildir. Sonuç itibariye her Master Page aynı zamanda arka planda bir örnek olarak oluşturulan bir sınıf tanımlamasıdır. Bu nedenle Master Page uyarlanan içerik sayfalarının (Content Page) ortaklaşa kullanabileceği fonksiyonellikleri dahi barındırabilir. Buda tam anlamıyla kalıtım (inheritance) ile yapabildiklerimizin bir yansımasıdır. İşte bu makalemizde Master Page kavramının derinlerine gidip diğer avantajlarını ve özellikle dikkat etmemiz gereken noktaların neler olabileceğini incelemeye çalışacağız. Temel olarak ele alacağımız konular aşağıda maddeler halinde sıralanmıştır.
• Master Page uygulanmamış bir web sayfasına sonradan Master Page uygulamaya çalışmak.
• İçerik sayfalarından(Content Page), Master Page üyelerine erişmek. (Özellikler(Properties) yadımıyla erişmek, kontrolleri bulmak(FindControl), MasterType direktifinden yararlanmak)
• Ortak fonksiyonellikleri Master Page altında toplamak.
• İçerik sayfalarından(Content Page) Master Page’ leri dinamik olarak değiştirmek.
• İç (Nested) Master Page’ ler geliştirmek ve kullanmak.
Bahsetmiş olduğumuz maddeleri örnek bir senaryo üzerinden incelemeye çalışacağız. Bu nedenle web uygulamamızda aşağıdaki gibi bir Master Page tasarlamış olduğumuzu düşünelim.

Kodlama dili (asp)
<%@ Master language="c#" Debug="true" Codebehind="AzonCityMaster.pas" AutoEventWireup="false" Inherits="AzonCityMaster.TMasterPage1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table border="1" cellpadding="3" cellspacing="1" width="640">
<tr>
<td colspan="2"><img src="images\csharpnedir.gif" /></td>
</tr>
<tr>
<td valign="top" style="WIDTH: 150px"><asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1"></asp:TreeView></td>
<td style="TEXT-ALIGN: right"><asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"></asp:ContentPlaceHolder></td>
</tr>
<tr>
<td colspan="2" style="TEXT-ALIGN: right"><span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; TEXT-DECORATION: underline"><font face="Times New Roman" size="3"><a href="mailto:fatih@mfkucukkelepce.com">fatih@mfkucukkelepce.com</a>
</font>
</span>
<img src="images\google_coop.gif" /></td>
</tr>
</table>
</div>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
</form>
</body>
</html>
Geliştirdiğimiz Master Page içerisinde sitedeki diğer sayfalara kolay geçiş yapmamızı sağlayacak şekilde bir TreeView kontrolü ve buna bağlı olacak şekilde tasarlanmış bir SiteMapDataSource bileşeni de vardır. Diğer taraftan sadece göze hoş gelmesi açısından bir kaç resim bileşeni dahil edilmiş ve tek bir ContentPlaceHolder kullanılmıştır.
Master Page’ lerin bazı önemli özellikleri vardır. Makalemizin konusu olan maddelere geçmeden önce, Master Page’ lerin uygulandığı içerik sayfalarının (Content Page) herhangibir şekilde html, head, body, vb... takılar ile birlikte kesinlikle form takısını içermediğidir. İşte bu ayırt edici özellik makalemizin ilk maddesi için önemlidir.
1. Master Page uygulanmamış bir web sayfasına sonradan Master Page uygulamaya çalışmak.Çoğu zaman projelerimizde sonradan Master Page kullanmaya karar verdiğimiz durumlar olabilir. (Yada buna neden olacak başka vakkalar olabilir) Var olan bir Master Page’ den , içerik sayfaları (Content Page) oluşturmamız kolaydır. Delphi 2007 buna tam destek vermektedir. Ancak var olan bir web sayfasına, herhangibir Master Page’ i sonradan uygulamak istediğimizde yapmamız gerekenler temel olarak şu şekilde özetlenebilir.
• İçerik sayfasının(Content Page) içerisinde Html, Body, Head, Title vb... ile form elementlerinin olmaması gerekir.
• Sayfanın Page direktifi içerisinde Master Page tanımlaması MasterPageFile isimli nitelik yardımıyla yapılmalıdır.
• Master Page içerisinde yer alan ContentPlaceHolder’ ların, içerik sayfasında birer Content bileşeni olarak ele alınması gerekmektedir.
Konuyu daha iyi anlayabilmek için bir örnek üzerinden gidelim ve uygulamamızda kullandığımız sayfalardan herhangi birini ele alalım. Örnek olarak aşağıdaki ekran görüntüsüne sahip olan bloglar.aspx sayfasını kullanabiliriz.

Kodlama dili (asp)
<%@ Page language="c#" Debug="true" Codebehind="Bloglar.pas" AutoEventWireup="false" Inherits="Bloglar.TBloglar" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<span style="font-size: 10pt; font-family: Verdana"><strong>Aradığınız Blog sahibinin adını giriniz </strong><br /></span>
<asp:TextBox ID="TextBox1" runat="server" Width="208px"></asp:TextBox><span style="font-size: 10pt;font-family: Verdana"> </span>
<asp:Button ID="Button1" runat="server" Text="Ara" Width="65px" /><span style="font-size: 10pt;font-family: Verdana"><br /></span>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="http://www.csharpnedir.com">Yardım</asp:HyperLink><br />
<span style="font-size: 10pt; font-family: Verdana"><strong>Sonuçlar</strong><br /></span>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" Width="214px"></asp:DropDownList>
</div>
</form>
</body>
</html>
Şimdi gelin adım adım bu sayfaya AzonCityMaster isimli Master Page’ imizi uygulayalım. İlk olarak Page direktifi içerisinde MasterPageFile niteliği yardımıyla uygulamak istediğimiz Master Page’ in fiziki dosyasını belirlemeliyiz. Aksi takdirde ~ harfinide göz
Kodlama dili (asp)
<%@ Page language="c#" Debug="true" Codebehind="Bloglar.pas" AutoEventWireup="false" Inherits="Bloglar.TBloglar" MasterPageFile="~/AzonCityMaster.master" %>
Bir sonraki adımımız form elementleri içerisinde yer alan bileşenlerimizi bir Content elementi içerisine almak olacaktır. Buradan şu sonucada varabiliriz. İçerik sayfaları bileşen olarak sadece Content elementlerini içermektedir. İçerik sayfaları hiç bir şekilde form elementi içermeyeceklerinden (Html, Body vb kısımlarda buna dahildir) Bloglar.aspx isimli sayfamıza, Master Page’ deki hangi ContentPlaceHolder bileşenini kullanacaksak ona uygun bir Content bileşenini aşağıdaki gibi eklememiz gerekir.
Kodlama dili (asp)
<%@ Page language="c#" Debug="true" Codebehind="Bloglar.pas" AutoEventWireup="false" Inherits="Bloglar.TBloglar" MasterPageFile="~/AzonCityMaster.master" %>
<asp:Content ContentPlaceHolderID="ContentPlaceHolder1" ID="Content1" runat="server">
</asp:Content>
Son olarak tek yapmamız gereken Content elementi içerisine, bloglar.aspx sayfasının bir önceki halinde yer alan Asp.Net bileşenlerini dahil etmek olacaktır. Burada dikkat edilmesi gereken nokta, Asp.Net bileşenlerine ait elementlerin, mutlaka ve mutlaka Content elementinin takıları (tags) içerisinde olması gerektiğidir. Biz örneklerimizde tek bir ContentPlaceHolder kullandığımızdan, içerik sayfasındaki Content bileşenide tektir. Dolayısıyla, Master Page içerisindeki ContentPlaceHolder’ ların sayısına göre içerik sayfalarında uygulanması gereken Content bileşenlerinin sayısı artabilir.
Kodlama dili (asp)
<%@ Page language="c#" Debug="true" Codebehind="Bloglar.pas" AutoEventWireup="false" Inherits="Bloglar.TBloglar" MasterPageFile="~/AzonCityMaster.master" %>
<asp:Content ContentPlaceHolderID="ContentPlaceHolder1" ID="Content1" runat="server">
<span style="font-size: 10pt; font-family: Verdana"><strong>Aradığınız Blog sahibinin adını giriniz </strong><br /></span>
<asp:TextBox ID="TextBox1" runat="server" Width="208px"></asp:TextBox><span style="font-size: 10pt;font-family: Verdana"> </span>
<asp:Button ID="Button1" runat="server" Text="Ara" Width="65px" /><span style="font-size: 10pt;font-family: Verdana"><br /></span>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="http://www.csharpnedir.com">Yardım</asp:HyperLink><br />
<span style="font-size: 10pt; font-family: Verdana"><strong>Sonuçlar</strong><br /></span>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" Width="214px"></asp:DropDownList>
</asp:Content>
Bu işlemlerin ardından Bloglar.aspx isimli sayfamız, Master Page’ i uygulayan bir içerik sayfası haline gelecektir.
2 . İçerik sayfalarından(Content Page), Master Page’ in üyelerine erişmek.Master Page’ ler, kendisinden üretilen içerik sayfaları için ortaklaşa kullanılabilecek üyeler (örneğin metodlar) içerebilirler. Özellikle tüm sayfalarda söz konusu olabilecek veritabanı işlemlerine ait hazırlıkların tek bir merkezden yapılabilmesini sağlamak bu ortak fonksiyonellikler için bir örnek olarak düşünülebilir. Diğer taraftan içerik sayfalarındaki süreçlerin işleyişine göre Master Page üzerindeki kontrollerin davranışlarını değiştirmek isteyebiliriz. Tüm bunlar aslında kalıtımın(inheritance) bir etkisi olarak karşımıza çıkmaktadır. Öyleki Asp.Net 1.1 ile geliştirme yapanların, Master Page tarzı mimariler için geliştirdikleri çözümler kalıtım(inheritance) ilkelerine dayanılarak gerçekleştirilmiştir. Ne varki Asp.Net 2.0 ile birlikte gelen Master Page kavramı, sadece görsel açıdan değil kod tarafındanda kalıtımı etkin bir şekilde kullanabilme imkanı sağlamaktadır. Dolayısıyla bazı durumlarda içerik sayfalarından Master Page’ lerin ele alınması gerekebilir. Bu durumları bir kaç basit örnek ile incelemekte fayda vardır. İlk olarak, içerik sayfalarında iken, Master Page’ in başlık bilgisini (Title) ve hatta MasterPage ile birlikte üretilen metadata bilgilerini değiştirmek istediğimizi düşünelim. Bu amaçla yine bloglar.aspx sayfasını göz önüne alabiliriz. Sayfamızın Load olayı tetiklendiğinde aşağıdaki işlemleri gerçekleştirdiğimizi düşünelim.
Kodlama dili (delphi)
procedure TBloglar.Page_Load(sender: System.object; e: System.EventArgs);
var
metadatas: HtmlMeta;
begin
Self.Master.Page.Title := 'Azon Þehri Sakinlerinin Bloglarý';
metadatas := HtmlMeta.Create;
metadatas.Name := 'Keywords';
metadatas.Content := 'Blog, Azon, City, Azon City, Yemek, Gurme, Kermes';
Self.Master.Page.Header.Controls.Add(metadatas);
Self.Master.Page.SmartNavigation := true;
end;
İçerik sayfasından eğer Master Page referansına geçiş yapmak istiyorsak, Master özelliğinden faydalanabiliriz. Örnek kodumuzda, Master Page yardımıyla üretilen sayfanın title, metadata, smart navigation gibi özelliklerini değiştiriyoruz. Buna göre Title özelliğini değiştirmek için Self.Master.Page.Title söz diziminden yararlanılmıştır. Metadata bilgisini eklemek içinse öncelikli olarak HtmlMeta tipinden bir nesne örneklenmiştir. Bu nesnenin iki önemli özelliği vardır. Name ve Content. Bu iki özelliğe atadığımız değerlere göre, sayfamızın arama sitelerinde metadata içerisinde belirttiğimiz konu başlıkları altında çıkması muhtemeldir. Üretilen metadata elementinin Master Page’ e ait Html çıktısına yazılabilmesi içinde Master.Page.Header.Controls söz diziminden yararlanılmıştır. Bir başka deyişle Head elementi içerisine girilerek Controls koleksiyonuna, oluşturulan Metadata bilgileri eklenmiştir. Son olarak üretilen sayfanın SmartNavigation özelliği ture yapılmıştır. Bloglar.aspx sayfamızı herhangibir tarayıcı penceresinde açtığımızda aşağıdaki ekran görüntüsünü elde ederiz.

Bir diğer senaryo ise, içerik sayfalarından Master Page içerisindeki her hangibir kontrolün davranışını değiştirmektir. Örneğin Master Page üzerinde yer alan bir Label kontrolü içerisinde, girilen içerik sayfasına ait bir takım özel bilgilerin yazması istenebilir. Kullanıcının adı bu kontrolde gösterilebilir yada yetkisine göre renklendirmeler yapılabilir. Senaryolar elbette çoğaltılabilir. Odaklanılması gereken nokta bu kontrole içerik sayfaları üzerinden nasıl erişilebileceğidir. Bu amaçla bir kaç yöntem ele alınabilir. Örneğin FindControl metodu yardımıyla Label kontrolü bulunabilir yada Master Page içerisine yazılacak bir özellikten (Property) faydalanılabilinir. Hatta kullanım kolaylığı sağlaması bakımından MasterType direktifinden de yararlanılabilir.
Şimdi bunları teker teker ele alalım. Görsel tabanlı uygulamalarda özellikle taşıyıcı (Container) rolü üstlenen bileşenlerin çoğunun FindControl metodu vardır. Bu metod sayesinde, ID veya Name gibi özelliklerine göre ilgili taşıyıcı içerisinden herhangibir kontrol bulunabilir. Bunun sonrasında tek yapılması gereken kontrolün ilgili özelliklerinin değiştirilmesidir. Konuyu daha iyi anlayabilmek için Master Page içerisine bir Label kontrolü atılmış ve lblBilgi olarak isimlendirilmiştir. Buna göre Bloglar.aspx sayfasından bu Label kontrolüne erişip içeriğini değiştirmek için aşağıdaki gibi bir yol izlenebilir. (Kod parçası bloglar.aspx sayfasının Page_Load olay metodu içerisinde ele alınmıştır.)
Kodlama dili (delphi)
procedure TBloglar.Page_Load(sender: System.object; e: System.EventArgs);
begin
with Self.Master.FindControl('lblMaster') as &label do
begin
Text := 'Bloglar sayfasından geldim';
ForeColor := System.Drawing.Color.Red;
Font.Bold := true;
Font.Name := 'Verdana';
Font.Size := 10;
end;
end;
Dikkat ederseniz Master Page içerisindeki lblBilgi kontrolünü bulmak için FindControl metodundan faydalanıyoruz. FindControl metodu parametre olarak aranan bileşenin ID özelliğinin değerini almaktadır. Elbette FindControl metodunun geri dönüş değeri Control tipindendir. Bu sebeptende geri dönen kontrol referansının değerinin Label olarak ele alınabilmesi için bilinçli bir şekilde dönüştürme(explicitly cast) işlemi uygulanmıştır. Böylece lblBilgi isimli Label kontrolüne ait çalışma zamanı referansını bloglar.aspx sayfası içerisinde ele alabilir ve özelliklerini değiştirebiliriz. Bunun ardından aşağıdaki ekran görüntüsündeki sonucu elde ederiz.
4. İçerik sayfalarından(Content Page) Master Page’ leri dinamik olarak değiştirmek.Bazı durumlarda senaryo gereği, içerik sayfalarının uygulayacağı Master Page’ i çalışma zamanında değiştirmemiz gerekebilir. Örneğin çoğu sayfada yer alan print görünümünü alma işlemi göz önüne alınabilir. Bu tip bir durumda, Print sayfasının içeriğinin farklı olması nedeni ile, ayrı bir Master Page’ in çalışma zamanında söz konusu içerik sayfası için uygulanması gerekir. Bir başka senaryo özellikle farklı kültürlere hizmet verecek içerik sayfalarında söz konusu olabilir. Kullanıcının seçtiği ülkeye göre içerik sayfasının farklı bir Master Page uygulaması istenebilir. Hatta, içerik sayfasındaki kullanıcının yetkisine görede farklı Master Page’ lerin uygulatılması gerekebilir. Tüm bu durumlar temel olarak çalışma zamanında Master Page’ in değiştirilebilmesi halinde gerçekleşebilecek örnek senaryolardır. Bir içerik sayfasının çalışma zamanında uyguladığı Master Page’ i değiştirmek için tek yapılması gereken, sayfanın MasterPageFile özelliğine uygun bir değer atamaktır.
MasterPageFile özelliği sadece içerik sayfasının PreInit olay metodu içerisinde değiştirilebilir.
Kodlama dili (delphi)
Self.MasterPageFile = '~/YeniMaster.master';
Ynt: Master Page Kavvramı Gönderen: FetihlerFatihi Tarih: 03 January 2008 22:34:50
Notice: Undefined index: current_action in
/home/del10000/domains/delphidunyasi.net/public_html/Sources/Subs.php on line
2391
Bir tek iç içe master sayfalar kaldı. Onu da en yakın zaman da eklerim inşallah.