Aracılığıyla paylaş


Ana Sayfayı Programlı Olarak Belirtme (VB)

tarafından Scott Mitchell

PreInit olay işleyicisi aracılığıyla içerik sayfasının ana sayfasını program aracılığıyla ayarlamaya bakar.

Giriş

Ana Sayfaları Kullanarak Site Genelinde Düzen Oluşturma'daki ilk örnekten bu yana, tüm içerik sayfaları yönergesindeki MasterPageFile @Page özniteliği aracılığıyla ana sayfalarına bildirimli olarak başvurmlanmıştır. Örneğin, aşağıdaki @Page yönerge içerik sayfasını ana sayfaya Site.masterbağlar:

<%@ Page Language="C#" MasterPageFile="~/Site.master"... %>

Page Ad alanındaki System.Web.UI sınıfı, içerik sayfasının ana sayfasının yolunu döndüren birMasterPageFile özellik içerir; yönergesi tarafından @Page ayarlanan bu özelliktir. Bu özellik, içerik sayfasının ana sayfasını program aracılığıyla belirtmek için de kullanılabilir. Ana sayfayı, sayfayı ziyaret eden kullanıcı gibi dış faktörlere göre dinamik olarak atamak istiyorsanız bu yaklaşım yararlıdır.

Bu öğreticide web sitemize ikinci bir ana sayfa ekleyecek ve çalışma zamanında hangi ana sayfanın kullanılacağına dinamik olarak karar yeceğiz.

1. Adım: Sayfa Yaşam Döngüsüne Bakış

İçerik sayfası olan bir ASP.NET sayfası için web sunucusuna her istek geldiğinde, ASP.NET altyapısının sayfanın İçerik denetimlerini ana sayfanın ilgili ContentPlaceHolder denetimleriyle birleştirmesi gerekir. Bu fusion, daha sonra tipik sayfa yaşam döngüsü boyunca ilerleyebilen tek bir denetim hiyerarşisi oluşturur.

Şekil 1'de bu füzyon gösterilmektedir. Şekil 1'deki 1. adım, ilk içeriği ve ana sayfa denetimi hiyerarşilerini gösterir. PreInit aşamasının sonunda, sayfadaki İçerik denetimleri ana sayfadaki ilgili ContentPlaceHolders'a eklenir (2. Adım). Bu füzyondan sonra ana sayfa, birleşik denetim hiyerarşisinin kökü olarak görev yapar. Bu birleşik denetim hiyerarşisi, son haline getirilmiş denetim hiyerarşisini oluşturmak için sayfaya eklenir (3. Adım). Net sonuç, sayfanın denetim hiyerarşisinin birleştirilmiş denetim hiyerarşisini içermesidir.

Ana Sayfa ve İçerik Sayfasının Denetim Hiyerarşileri PreInit Aşaması Sırasında Birlikte Birleştirilir

Şekil 01: Ana Sayfa ve İçerik Sayfasının Denetim Hiyerarşileri PreInit Aşaması Sırasında Birlikte Birleştiriliyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

2. Adım: KoddanMasterPageFileÖzelliği Ayarlama

Bu füzyonda hangi ana sayfa bölümleri nesnenin MasterPageFile özelliğinin Page değerine bağlıdır. yönergesindeki özniteliğin MasterPageFile @Page ayarlanması, sayfanın yaşam döngüsünün ilk aşaması olan Başlatma aşamasında 's MasterPageFile özelliğini atamanın Pagenet etkisine sahiptir. Alternatif olarak bu özelliği program aracılığıyla ayarlayabiliriz. Ancak, Şekil 1'deki füzyon gerçekleşmeden önce bu özelliğin ayarlanması zorunludur.

PreInit aşamasının Page başlangıcında nesnesi olayını yükseltirPreInit ve yöntemini çağırırOnPreInit. Ana sayfayı program aracılığıyla ayarlamak için olay için PreInit bir olay işleyicisi oluşturabilir veya yöntemini geçersiz kılabiliriz OnPreInit . Her iki yaklaşıma da göz atalım.

İlk olarak, sitemizin giriş sayfasının arka planda kod dosyası dosyasını açın Default.aspx.vb. Aşağıdaki kodu yazarak sayfanın PreInit olayı için bir olay işleyicisi ekleyin:

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit 
End Sub

Buradan özelliği ayarlayabiliriz MasterPageFile . Kodu, özelliğine "~/Site.master" değerini atayacak şekilde güncelleştirin MasterPageFile .

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit 
 Me.MasterPageFile = "~/Site.master"
End Sub

Bir kesme noktası ayarlar ve hata ayıklamayla başlarsanız, sayfa her Default.aspx ziyaret edilirken veya bu sayfaya geri gönderme olduğunda olay işleyicisinin Page_PreInit yürütüldüğünü ve özelliğin MasterPageFile "~/Site.master" olarak atandığını görürsünüz.

Alternatif olarak, sınıfın Page OnPreInit yöntemini geçersiz kılabilir ve özelliğini orada ayarlayabilirsiniz MasterPageFile . Bu örnekte, ana sayfayı belirli bir sayfada değil, içinden BasePageayarlayalım. Ana Sayfada Başlık, Meta Etiketler ve Diğer HTML Üst Bilgilerini Belirtme öğreticisinde özel bir temel sayfa sınıfı (BasePage) oluşturduğumuz hatırlayın. Şu anda BasePage sayfanın özelliğini site haritası verilerine göre ayarladığı Title sınıfın OnLoadComplete yöntemini geçersiz kılarPage. Ana sayfayı program aracılığıyla belirtmek için yöntemini geçersiz kılacak OnPreInit şekilde güncelleştirelimBasePage.

Protected Overrides Sub OnPreInit(ByVal e As System.EventArgs)
 Me.MasterPageFile = "~/Site.master" 
 MyBase.OnPreInit(e)
End Sub

Tüm içerik sayfalarımız 'den BasePagetüretildiği için, artık hepsinin ana sayfası program aracılığıyla atanmıştır. Bu noktada PreInit içindeki Default.aspx.vb olay işleyicisi gereksizdir; kaldırmaktan çekinmeyin.

Yönerge ne olacak@Page?

Biraz kafa karıştırıcı olabilecek şey, içerik sayfalarının MasterPageFile özelliklerinin artık iki yerde belirtilmesidir: hem sınıfın OnPreInit BasePage yönteminde hem de her içerik sayfasının @Page yönergesindeki öznitelik aracılığıyla MasterPageFile program aracılığıyla.

Sayfa yaşam döngüsünün ilk aşaması Başlatma aşamasıdır. Bu aşamada nesnenin Page MasterPageFile özelliğine yönergesindeki @Page özniteliğin MasterPageFile değeri atanır (sağlanmışsa). PreInit aşaması Başlatma aşamasını izler ve burada nesnenin Page MasterPageFile özelliğini program aracılığıyla ayarlayıp yönergesinden @Page atanan değerin üzerine yazarız. Nesnenin Page MasterPageFile özelliğini program aracılığıyla ayarladığımız için, son kullanıcının deneyimini etkilemeden özniteliği yönergesinden @Page kaldırabilirizMasterPageFile. Kendinizi buna ikna etmek için, devam edin ve içindeki yönergesinden @Page Default.aspx özniteliğini kaldırın MasterPageFile ve ardından bir tarayıcı aracılığıyla sayfayı ziyaret edin. Beklediğiniz gibi, çıkış özniteliği kaldırılmadan öncekiyle aynıdır.

Özelliğin MasterPageFile yönergesi @Page aracılığıyla mı yoksa program aracılığıyla mı ayarlandığı, son kullanıcının deneyimine göre önemsizdir. Ancak yönergesindeki @Page özniteliği Visual MasterPageFile Studio tarafından tasarım zamanında tasarımcıda WYSIWYG görünümünü oluşturmak için kullanılır. Visual Studio'ya Default.aspx dönüp Tasarımcı'ya giderseniz "Ana Sayfa hatası: Sayfada Ana Sayfa başvurusu gerektiren denetimler var, ancak hiçbiri belirtilmemiş" iletisini görürsünüz (bkz. Şekil 2).

Kısacası, Visual Studio'da zengin bir tasarım zamanı deneyiminin @Page keyfini çıkarmak için özniteliğini yönergesinde bırakmanız MasterPageFile gerekir.

Visual Studio <span sınıfını kullanır=@Page Yönergesinin Tasarım Görünümünü İşlemek için MasterPageFile Özniteliği" />

Şekil 02: Visual Studio, Yönergenin @Page MasterPageFile Özniteliğini Kullanarak Tasarım Görünümünü İşlemektedir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

3. Adım: Alternatif Ana Sayfa Oluşturma

bir içerik sayfasının ana sayfası çalışma zamanında program aracılığıyla ayarlanabildiği için bazı dış ölçütlere göre belirli bir ana sayfayı dinamik olarak yüklemek mümkündür. Bu işlev, site düzeninin kullanıcıya göre değişmesi gereken durumlarda yararlı olabilir. Örneğin, bir blog altyapısı web uygulaması, kullanıcılarının blogları için her düzenin farklı bir ana sayfayla ilişkilendirildiği bir düzen seçmesine izin verebilir. Çalışma zamanında, bir ziyaretçi kullanıcının blogunu görüntülerken web uygulamasının blog düzenini belirlemesi ve ilgili ana sayfayı içerik sayfasıyla dinamik olarak ilişkilendirmesi gerekir.

Şimdi çalışma zamanında bazı dış ölçütlere göre ana sayfayı dinamik olarak yüklemeyi inceleyelim. Web sitemiz şu anda yalnızca bir ana sayfa (Site.master) içerir. Çalışma zamanında ana sayfa seçmeyi göstermek için başka bir ana sayfaya ihtiyacımız var. Bu adım, yeni ana sayfayı oluşturmaya ve yapılandırmaya odaklanır. 4. adım, çalışma zamanında hangi ana sayfanın kullanılacağını belirlemeye bakar.

adlı Alternate.masterkök klasörde yeni bir ana sayfa oluşturun. Ayrıca web sitesine adlı AlternateStyles.cssyeni bir stil sayfası ekleyin.

Web Sitesine Başka Bir Ana Sayfa ve CSS Dosyası Ekleme

Şekil 03: Web Sitesine Başka Bir Ana Sayfa ve CSS Dosyası Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ana sayfayı Alternate.master sayfanın en üstünde, ortalanmış ve donanma arka planında görüntülenecek şekilde tasarladım. Sol sütunu dağıtıp bu içeriği ContentPlaceHolder denetiminin MainContent altına taşıdım ve bu da sayfanın tüm genişliğine yayılmış durumda. Ayrıca, sıralanmamış Dersler listesini nixed ve üzerinde MainContentyatay bir liste ile değiştirdim. Ayrıca ana sayfa tarafından kullanılan yazı tiplerini ve renkleri (ve uzantıya göre içerik sayfalarını) güncelleştirdim. Şekil 4'te ana sayfa kullanılırken gösterilmektedir Default.aspx Alternate.master .

Not

ASP.NET, Tema tanımlama özelliğini içerir. Tema, çalışma zamanında bir sayfaya uygulanabilen resim, CSS dosyaları ve stille ilgili Web denetimi özelliği ayarlarından oluşan bir koleksiyondur. Sitenizin düzenleri yalnızca görüntülenen görüntülerde ve CSS kurallarına göre farklılık gösteriyorsa, temalar gidilir. Düzenler farklı Web denetimleri kullanmak veya tamamen farklı bir düzene sahip olmak gibi daha önemli ölçüde farklıysa, ayrı ana sayfalar kullanmanız gerekir. Temalar hakkında daha fazla bilgi için bu öğreticinin sonundaki Daha Fazla Okuma bölümüne bakın.

İçerik Sayfalarımız Artık Yeni Bir Görünüm Kullanabilir

Şekil 04: İçerik Sayfalarımız Artık Yeni Bir Genel Görünüm Kullanabilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ana ve içerik sayfalarının işaretlemesi birleştirildiğinde, sınıf içerik sayfasındaki her İçerik denetiminin MasterPage ana sayfadaki bir ContentPlaceHolder'a başvurduğundan emin olmak için denetler. Mevcut olmayan bir ContentPlaceHolder'a başvuran bir İçerik denetimi bulunursa bir özel durum oluşturulur. Başka bir deyişle, içerik sayfasına atanan ana sayfanın içerik sayfasındaki her İçerik denetimi için bir ContentPlaceHolder olması zorunludur.

Ana Site.master sayfa dört ContentPlaceHolder denetimi içerir:

  • head
  • MainContent
  • QuickLoginUI
  • LeftColumnContent

Web sitemizdeki içerik sayfalarından bazıları yalnızca bir veya iki İçerik denetimi içerir; diğerleri, kullanılabilir ContentPlaceHolder'ların her biri için bir İçerik denetimi içerir. Yeni ana sayfamız (Alternate.master) içinde tüm ContentPlaceHolders Site.master için İçerik denetimleri olan içerik sayfalarına atanabilirse, ile aynı ContentPlaceHolder denetimlerini Site.masterde eklemek önemlidirAlternate.master.

Ana sayfanızın Alternate.master benimkine benzer görünmesini sağlamak için (bkz. Şekil 4), stil sayfasında ana sayfanın stillerini AlternateStyles.css tanımlayarak başlayın. içine aşağıdaki kuralları AlternateStyles.cssekleyin:

body 
{
 font-family: Comic Sans MS, Arial; 
 font-size: medium; 
 margin: 0px; 
} 
#topContent 
{ 
 text-align: center; 
 background-color: Navy; 
 color: White; 
 font-size: x-large;
 text-decoration: none; 
 font-weight: bold; 
 padding: 10px; 
 height: 50px;
} 
#topContent a 
{ 
 text-decoration: none; 
 color: White; 
} 
#navContent 
{ 
 font-size: small; 
 text-align: center; 
} 
#footerContent 
{ 
 padding: 10px; 
 font-size: 90%; 
 text-align: center; 
 border-top: solid 1px black; 
} 
#mainContent 
{ 
 text-align: left; 
 padding: 10px;
}

Ardından, aşağıdaki bildirim temelli işaretlemeyi öğesine Alternate.masterekleyin. Gördüğünüz gibi, Alternate.master içindeki ContentPlaceHolder denetimleriyle aynı ID değerlere sahip dört ContentPlaceHolder denetimi Site.masteriçerir. Ayrıca, web sitemizdeki ASP.NET AJAX çerçevesini kullanan sayfalar için gerekli olan bir ScriptManager denetimi içerir.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
 <title>Untitled Page</title>
 <asp:ContentPlaceHolder id="head" runat="server">
 </asp:ContentPlaceHolder> 
 <link href="AlternateStyles.css" rel="stylesheet" type="text/css"/> 
</head> 
<body> 
 <form id="form1" runat="server"> 
 <asp:ScriptManager ID="MyManager" runat="server"> 
 </asp:ScriptManager>
 <div id="topContent">
 <asp:HyperLink ID="lnkHome" runat="server" NavigateUrl="~/Default.aspx" 
 Text="Master Pages Tutorials" /> 
 </div>
 <div id="navContent"> 
 <asp:ListView ID="LessonsList" runat="server" 
 DataSourceID="LessonsDataSource">
 <LayoutTemplate>
 <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> 
 </LayoutTemplate>
 <ItemTemplate>
 <asp:HyperLink runat="server" ID="lnkLesson" 
 NavigateUrl='<%# Eval("Url") %>' 
 Text='<%# Eval("Title") %>' /> 
 </ItemTemplate>
 <ItemSeparatorTemplate> | </ItemSeparatorTemplate> 
 </asp:ListView>
 <asp:SiteMapDataSource ID="LessonsDataSource" runat="server" 
 ShowStartingNode="false" /> 
 </div> 
 <div id="mainContent">
 <asp:ContentPlaceHolder id="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </div>
 <div id="footerContent">
 <p> 
 <asp:Label ID="DateDisplay" runat="server"></asp:Label> 
 </p>
 <asp:ContentPlaceHolder ID="QuickLoginUI" runat="server"> 
 </asp:ContentPlaceHolder>
 <asp:ContentPlaceHolder ID="LeftColumnContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </div> 
 </form>
</body> 
</html>

Yeni Ana Sayfayı Test Etme

Bu yeni ana sayfayı test etmek için, özelliğine BasePage değer "~/Alternate.maser" atanacak şekilde sınıfın OnPreInit MasterPageFile yöntemini güncelleştirin ve ardından web sitesini ziyaret edin. İki sayfa dışında her sayfa hatasız çalışmalıdır: ~/Admin/AddProduct.aspx ve ~/Admin/Products.aspx. DetailsView'a ~/Admin/AddProduct.aspx ürün eklemek, ana sayfanın GridMessageText özelliğini ayarlamaya çalışan kod satırından bir NullReferenceException sonuç verir. Sayfa yükünde şu iletiyle bir InvalidCastException ziyaret ~/Admin/Products.aspx edilir: "'ASP.alternate_master' türündeki nesne 'ASP.site_master' türüne oluşturulamıyor."

Bu hatalar, arka planda kod sınıfının içinde Alternate.mastertanımlanmayan Site.master genel olayları, özellikleri ve yöntemleri içermesi nedeniyle oluşur. Bu iki sayfanın işaretleme bölümü, ana sayfaya başvuran bir @MasterType yönergeye Site.master sahiptir.

<%@ MasterType VirtualPath="~/Site.master" %>

Ayrıca, DetailsView'un ItemInserted içindeki olay işleyicisi ~/Admin/AddProduct.aspx , gevşek türdeki Page.Master özelliğini türünde Sitebir nesneye dönüştüren kod içerir. yönergesi @MasterType (bu şekilde kullanılır) ve olay işleyicisindeki ItemInserted atama, ve ~/Admin/Products.aspx sayfalarını ana sayfayla sıkı bir şekilde bir arada Site.master kullanır~/Admin/AddProduct.aspx.

Bu sıkı bağlamayı kesmek için ortak üyelerin tanımlarını içeren ortak bir temel sınıfa sahip Site.master olabilir ve Alternate.master bu sınıftan türetebiliriz. Bundan sonra, bu ortak temel türe başvurmak için yönergesini @MasterType güncelleştirebiliriz.

Özel Temel Ana Sayfa Sınıfı Oluşturma

adlı BaseMasterPage.vb klasöre App_Code yeni bir sınıf dosyası ekleyin ve dosyasından System.Web.UI.MasterPagetüretilmiş olmasını sağlayın. yöntemini ve özelliğini içinde tanımlamamız RefreshRecentProductsGrid gerekiyor, ancak bu üyeler ana sayfaya Site.master (RecentProductsGridView ve GridMessage GridMessageText Etiket) özgü Web denetimleriyle çalıştığından, bunları oradan Site.master taşıyamıyoruz.BaseMasterPage

Yapmamız gereken, bu üyelerin orada tanımlandığı ama aslında türetilmiş sınıfları (Site.master ve Alternate.master) tarafından BaseMasterPageuygulanabilecek şekilde yapılandırmaktırBaseMasterPage. Bu tür devralma, sınıfı olarak ve üyelerini olarak MustInherit MustOverrideişaretleyerek mümkündür. Kısacası, sınıfına ve iki üyesine bu anahtar sözcüklerin eklenmesi, ve GridMessageText'yi uygulamayan BaseMasterPage RefreshRecentProductsGrid ancak türetilmiş sınıflarının uygulayacağını duyurur.

Ayrıca içinde BaseMasterPage olayını tanımlamamız PricesDoubled ve olayı yükseltmek için türetilmiş sınıflar tarafından bir araç sağlamamız gerekir. Bu davranışı kolaylaştırmak için .NET Framework'te kullanılan desen, temel sınıfında genel bir olay oluşturmak ve adlı OnEventNamekorumalı, geçersiz kılınabilir bir yöntem eklemektir. Türetilmiş sınıflar daha sonra olayı başlatmak için bu yöntemi çağırabilir veya olay tetiklenmeden hemen önce veya sonra kodu yürütmek için geçersiz kılabilir.

Sınıfınızı BaseMasterPage aşağıdaki kodu içerebilecek şekilde güncelleştirin:

Public MustInherit Class BaseMasterPage 
 Inherits System.Web.UI.MasterPage 
 Public Event PricesDoubled As EventHandler
 Protected Overridable Sub OnPricesDoubled(ByVal e As EventArgs)
 RaiseEvent PricesDoubled(Me, e)
 End Sub
 Public MustOverride Sub RefreshRecentProductsGrid() 
 Public MustOverride Property GridMessageText() As String 
End Class

Ardından, arka planda kod sınıfına Site.master gidin ve öğesinden BaseMasterPagetüretilmiş olmasını sağlayın. BaseMasterPage İşaretlenen MustOverride üyeler içerdiği için bu üyeleri burada geçersiz Site.masterkılmamız gerekir. Overrides yöntem ve özellik tanımlarına anahtar sözcüğünü ekleyin. Ayrıca Button'un olay işleyicisinde DoublePrice olayı oluşturan PricesDoubled kodu temel sınıfın yöntemine yapılan bir çağrıyla güncelleştirinOnPricesDoubled.Click

Bu değişikliklerden Site.master sonra arka planda kod sınıfı aşağıdaki kodu içermelidir:

Partial Class Site 
 Inherits BaseMasterPage
 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
 DateDisplay.Text = DateTime.Now.ToString("dddd, MMMM dd")
 End Sub
 Public Overrides Sub RefreshRecentProductsGrid() 
 RecentProducts.DataBind()
 End Sub 
 Public Overrides Property GridMessageText() As String 
 Get
 Return GridMessage.Text
 End Get 
 Set(ByVal Value As String) 
 GridMessage.Text = Value 
 End Set
 End Property 
 Protected Sub DoublePrice_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DoublePrice.Click 
 ' Double the prices 
 DoublePricesDataSource.Update()
 ' Refresh RecentProducts 
 RecentProducts.DataBind()
 ' Raise the PricesDoubled event
 MyBase.OnPricesDoubled(EventArgs.Empty)
 End Sub 
End Class

Ayrıca iki MustOverride üyeden BaseMasterPage türetmek ve geçersiz kılmak için 'nin arka planda kod sınıfını güncelleştirmemiz Alternate.mastergerekir. Alternate.master Ancak, en son ürünleri listeleyen bir GridView veya veritabanına yeni bir ürün eklendikten sonra ileti görüntüleyen bir Etiket içermediğinden, bu yöntemlerin hiçbir şey yapması gerekmez.

Partial Class Alternate 
 Inherits BaseMasterPage
 Public Overrides Property GridMessageText() As String 
 Get
 Return String.Empty
 End Get
 Set(ByVal value As String) 
 ' Do nothing 
 End Set 
 End Property 
 Public Overrides Sub RefreshRecentProductsGrid()
 ' Do nothing 
 End Sub 
End Class

Temel Ana Sayfa Sınıfına Başvurma

Sınıfı tamamladığımıza BaseMasterPage ve iki ana sayfamızın genişletilmesine sahip olduğumuza göre, son adımımız ve ~/Admin/Products.aspx sayfalarını bu ortak türe başvurmak üzere güncelleştirmektir~/Admin/AddProduct.aspx. Her iki sayfada yönergesini @MasterType değiştirerek başlayın:

<%@ MasterType VirtualPath="~/Site.master" %>

Hedef:

<%@ MasterType TypeName="BaseMasterPage" %>

Özelliği artık bir dosya yoluna @MasterType başvurmak yerine temel türe (BaseMasterPage ) başvuruyor. Sonuç olarak, her iki sayfanın arka planda kod sınıflarında kullanılan kesin türü belirlenmiş Master özellik artık türündedir BaseMasterPage (türü Siteyerine). Bu değişiklik gerçekleştiğinde öğesini yeniden ziyaret edin ~/Admin/Products.aspx. Daha önce, sayfa ana sayfayı kullanacak Alternate.master şekilde yapılandırıldığından, ancak @MasterType yönerge dosyaya başvurdu Site.master . Ancak artık sayfa hatasız işlenir. Bunun nedeni Alternate.master , ana sayfanın türündeki BaseMasterPage bir nesneye (genişletildiğinden) yayınlanabilir olmasıdır.

içinde ~/Admin/AddProduct.aspxyapılması gereken küçük bir değişiklik vardır. DetailsView denetiminin ItemInserted olay işleyicisi hem kesin olarak türü belirlenmiş Master özelliği hem de gevşek türlenmiş Page.Master özelliği kullanır. Yönergesini güncelleştirdiğimizde kesin olarak türü belirlenmiş başvuruyu @MasterType düzelttiğimizde, ancak yine de gevşek türdeki başvuruyu güncelleştirmemiz gerekiyor. Aşağıdaki kod satırını değiştirin:

Dim myMasterPage As Site = CType(Page.Master, Site)

Temel türe dönüştüren Page.Master aşağıdakilerle:

Dim myMasterPage As BaseMasterPage = CType(Page.Master, BaseMasterPage)

4. Adım: İçerik Sayfalarına Hangi Ana Sayfanın Bağlanacağını Belirleme

Sınıfımız BasePage şu anda tüm içerik sayfalarının MasterPageFile özelliklerini sayfa yaşam döngüsünün PreInit aşamasında sabit kodlanmış bir değere ayarlar. Bu kodu ana sayfayı bazı dış faktörlere dayandıracak şekilde güncelleştirebiliriz. Yüklenecek ana sayfa, şu anda oturum açmış olan kullanıcının tercihlerine bağlı olabilir. Bu durumda, şu anda ziyaret eden kullanıcının ana sayfa tercihlerini aramak için yönteminde BasePage kod OnPreInit yazmamız gerekir.

Şimdi kullanıcının hangi ana sayfayı (veya Alternate.master ) kullanacağını Site.master seçmesine olanak tanıyan bir web sayfası oluşturalım ve bu seçimi bir Oturum değişkenine kaydedelim. kök dizininde adlı ChooseMasterPage.aspxyeni bir web sayfası oluşturarak başlayın. Bu sayfayı (veya bundan sonra başka bir içerik sayfasını) oluştururken, ana sayfa içinde BasePageprogram aracılığıyla ayarlandığından bu sayfayı ana sayfaya bağlamanız gerekmez. Ancak, yeni sayfayı bir ana sayfaya bağlamazsanız, yeni sayfanın varsayılan bildirim temelli işaretlemesi bir Web Formu ve ana sayfa tarafından sağlanan diğer içeriği içerir. Bu işaretlemeyi uygun İçerik denetimleriyle el ile değiştirmeniz gerekir. Bu nedenle, yeni ASP.NET sayfasını ana sayfaya bağlamayı daha kolay buluyorum.

Not

Site.master Ve Alternate.master aynı ContentPlaceHolder denetim kümesine sahip olduğundan, yeni içerik sayfasını oluştururken hangi ana sayfayı seçtiğiniz önemli değildir. Tutarlılık için kullanmanızı Site.masteröneririm.

Web Sitesine Yeni İçerik Sayfası Ekleme

Şekil 05: Web Sitesine Yeni İçerik Sayfası Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Web.sitemap Dosyayı bu ders için bir girdi içerecek şekilde güncelleştirin. Ana Sayfalar için öğesinin altına <siteMapNode> aşağıdaki işaretlemeyi ekleyin ve AJAX dersini ASP.NET:

<siteMapNode url="~/ChooseMasterPage.aspx" title="Choose a Master Page" />

Sayfaya ChooseMasterPage.aspx herhangi bir içerik eklemeden önce, sayfanın arka planda kod sınıfını (yerineSystem.Web.UI.Page) türetecek BasePage şekilde güncelleştirmek biraz zaman alır. Ardından, sayfaya bir DropDownList denetimi ekleyin, özelliğini olarak MasterPageChoiceayarlayın ID ve "~/Site.master" ve "~/Alternate.master" değerlerine sahip Text iki ListItem ekleyin.

Sayfaya bir Düğme Web denetimi ekleyin ve ve ID Text özelliklerini SaveLayout sırasıyla ve "Düzen Seçimini Kaydet" olarak ayarlayın. Bu noktada sayfanızın bildirim temelli işaretlemesi aşağıdakine benzer olmalıdır:

<p> 
 Your layout choice: 
 <asp:DropDownList ID="MasterPageChoice" runat="server"> 
 <asp:ListItem>~/Site.master</asp:ListItem>
 <asp:ListItem>~/Alternate.master</asp:ListItem>
 </asp:DropDownList> 
</p> 
<p> 
 <asp:Button ID="SaveLayout" runat="server" Text="Save Layout Choice" /> 
</p>

Sayfa ilk kez ziyaret edildiğinde kullanıcının seçili ana sayfa seçimini görüntülememiz gerekir. Bir Page_Load olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
 If Not Page.IsPostBack Then 
 If Session("MyMasterPage") IsNot Nothing Then 
 Dim li As ListItem = MasterPageChoice.Items.FindByText(Session("MyMasterPage").ToString())
 If li IsNot Nothing Then 
 li.Selected = True
 End If 
 End If 
 End If 
End Sub

Yukarıdaki kod yalnızca ilk sayfa ziyaretinde yürütülür (sonraki geri göndermelerde yürütülür). İlk olarak Session değişkeninin MyMasterPage mevcut olup olmadığını denetler. Bulursa, DropDownList içinde eşleşen ListItem'i MasterPageChoice bulmaya çalışır. Eşleşen bir ListItem bulunursa, Selected özelliği olarak Trueayarlanır.

Kullanıcının seçimini Session değişkenine kaydeden koda MyMasterPage da ihtiyacımız var. Button'un Click olayı için SaveLayout bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

Protected Sub SaveLayout_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SaveLayout.Click 
 Session("MyMasterPage") = MasterPageChoice.SelectedValue 
 Response.Redirect("ChooseMasterPage.aspx")
End Sub

Not

Click Olay işleyicisi geri göndermede yürütülürken ana sayfa zaten seçilmiştir. Bu nedenle, kullanıcının açılan liste seçimi bir sonraki sayfa ziyaretinin ardından geçerli olmayacaktır. , Response.Redirect tarayıcıyı yeniden istemeye ChooseMasterPage.aspxzorlar.

ChooseMasterPage.aspx Sayfa tamamlandıktan sonra son görevimiz, özelliği Session değişkeninin MyMasterPage değerine göre atamaktır BasePage MasterPageFile. Oturum değişkeni ayarlanmadıysa varsayılan olarak değerine sahip olur BasePage Site.master.

Protected Overrides Sub OnPreInit(ByVal e As System.EventArgs)
 SetMasterPageFile() 
 MyBase.OnPreInit(e)
End Sub 
Protected Overridable Sub SetMasterPageFile() 
 Me.MasterPageFile = GetMasterPageFileFromSession() 
End Sub 
Protected Function GetMasterPageFileFromSession() As String 
 If Session("MyMasterPage") Is Nothing Then
 Return "~/Site.master"
 Else 
 Return Session("MyMasterPage").ToString() 
 End If 
End Function

Not

Nesnenin Page MasterPageFile özelliğini olay işleyicisinin OnPreInit dışına ve iki ayrı yönteme atayan kodu taşıdım. Bu ilk yöntem olan , SetMasterPageFileikinci yöntemi GetMasterPageFileFromSessiontarafından döndürülen değere özelliğini atarMasterPageFile. Yöntemini Overridable işaretledimSetMasterPageFile, böylece genişleten BasePage gelecekteki sınıflar gerekirse özel mantık uygulamak için isteğe bağlı olarak bunu geçersiz kılabilir. Sonraki öğreticide 'nin SetMasterPageFile özelliğini geçersiz kılmaya BasePageilişkin bir örnek göreceğiz.

Bu kod yerine yerleştirildiyse sayfayı ziyaret edin ChooseMasterPage.aspx . Başlangıçta, Site.master ana sayfa seçilidir (bkz. Şekil 6), ancak kullanıcı açılan listeden farklı bir ana sayfa seçebilir.

İçerik Sayfaları Site.master Ana Sayfası Kullanılarak Görüntülenir

Şekil 06: İçerik Sayfaları Ana Sayfa Kullanılarak Site.master Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

İçerik Sayfaları Artık Alternate.master Ana Sayfası Kullanılarak Görüntüleniyor

Şekil 07: İçerik Sayfaları Artık Ana Sayfa Kullanılarak Alternate.master Görüntüleniyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Özet

İçerik sayfası ziyaret edildiğinde İçerik denetimleri, ana sayfasının ContentPlaceHolder denetimleriyle birleşir. İçerik sayfasının ana sayfası, başlatma aşaması sırasında yönergenin Page MasterPageFile özniteliğine atanan sınıfın MasterPageFile @Page özelliğiyle gösterilir. Bu öğreticide gösterildiği gibi, PreInit aşamasının sonundan MasterPageFile önce bunu yaptığımız sürece özelliğine bir değer atayabiliriz. Ana sayfayı program aracılığıyla belirtebilmek, bir içerik sayfasını dış etkenlere göre dinamik olarak ana sayfaya bağlama gibi daha gelişmiş senaryolar için kapıyı açar.

Mutlu Programlama!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Yazar hakkında

Birden çok ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışır. Son kitabı Sams Teach Yourself ASP.NET 3.5 in 24 Hours. Scott'a adresinden mitchell@4GuysFromRolla.com veya adresinden blogu http://ScottOnWriting.NETaracılığıyla ulaşılabilir.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçireni Suchi Banerjee'ydi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır bırakın mitchell@4GuysFromRolla.com