İç İçe Geçmiş Ana Sayfalar (VB)Nested Master Pages (VB)

Scott Mitchell tarafındanby Scott Mitchell

Kodu indirin veya PDF 'yi indirinDownload Code or Download PDF

Bir ana sayfanın bir diğerinin içine nasıl ekleneceğini gösterir.Shows how to nest one master page within another.

GirişIntroduction

Son dokuz öğreticinin kursunda, ana sayfalarla site genelinde bir düzeni nasıl uygulayacağınızı gördük.Over the course of the past nine tutorials we have seen how to implement a site-wide layout with master pages. Bir Nutshell 'de, ana sayfalar, ana sayfada bir içerik sayfası sayfa temelinde özelleştirilebilecek belirli bölgelerle birlikte ana sayfada ortak biçimlendirme tanımlamasına olanak tanır.In a nutshell, master pages allow us, the page developer, to define common markup in the master page along with specific regions that can be customized on a content page-by-content page basis. Ana sayfadaki ContentPlaceHolder denetimleri özelleştirilebilir bölgeleri belirtir; ContentPlaceHolder denetimleri için özelleştirilmiş biçimlendirme içerik sayfasında Içerik denetimleri aracılığıyla tanımlanır.The ContentPlaceHolder controls in a master page indicate the customizable regions; the customized markup for the ContentPlaceHolder controls are defined in the content page via Content controls.

Şimdiye kadar araştırdığımız ana sayfa teknikleri, tüm sitede tek bir düzen varsa harika.The master page techniques we've explored thus far are great if you have a single layout used across the entire site. Ancak, birçok büyük web sitesinin çeşitli bölümler genelinde özelleştirilmiş bir site düzeni vardır.However, many large websites have a site layout that is customized across various sections. Örneğin, hastane personeli tarafından hasta bilgilerini, etkinliklerini ve faturalandırmayı yönetmek için kullanılan bir sistem durumu bakım uygulaması düşünün.For example, consider a health care application used by hospital staff to manage patient information, activities, and billing. Bu uygulamada üç tür Web sayfası olabilir:There may be three types of web pages in this application:

  • Personel üyelerinin kullanılabilirliği güncelleştirebileceği, zamanlamaları görüntüleyebileceği veya tatil süresi isteyebildiği personele üyeye özgü sayfalar.Staff member-specific pages where staff members can update availability, view schedules, or request vacation time.
  • Personel üyelerinin belirli bir hasta için bilgileri görüntülemesi veya düzenlemesi gereken hasta 'e özgü sayfalar.Patient-specific pages where staff members view or edit information for a specific patient.
  • Muhasebeciler geçerli talep durumlarını ve finansal raporları incelemesinin faturalandırmaya özgü sayfalar.Billing-specific pages where accountants review current claim statuses and financial reports.

Her sayfa, üstteki bir menü ve alt taraftaki sık kullanılan bağlantılar dizisi gibi ortak bir düzen paylaşabilir.Every page might share a common layout, such as a menu across the top and a series of frequently used links along the bottom. Ancak personel, hasta ve faturalandırmaya özgü sayfaların bu genel düzeni özelleştirmesi gerekebilir.But the staff-, patient-, and billing-specific pages may need to customize this generic layout. Örneğin, personele özgü tüm sayfalar, şu anda oturum açmış olan kullanıcının kullanılabilirliğini ve günlük zamanlamayı gösteren bir takvim ve görev listesi içermelidir.For example, perhaps all staff-specific pages should include a calendar and task list showing the currently logged on user's availability and daily schedule. Hasta 'e özgü tüm sayfaların, bilgileri düzenlenmekte olan hasta için ad, adres ve sigorta bilgilerini göstermesi gerekir.Perhaps all patient-specific pages need to show the name, address, and insurance information for the patient whose information is being edited.

İç içe yerleştirilmiş ana sayfalarkullanılarak bu tür özelleştirilmiş düzenler oluşturmak mümkündür.It's possible to create such customized layouts by using nested master pages. Yukarıdaki senaryoyu uygulamak için, özelleştirilebilir bölgeleri tanımlayan Contentyertutucuları olan site genelinde düzeni, menü ve alt bilgi içeriğini tanımlayan bir ana sayfa oluşturarak başlayacağız.To implement the above scenario, we would start by creating a master page that defined the site-wide layout, the menu and footer content, with ContentPlaceHolders defining the customizable regions. Daha sonra her Web sayfası türü için bir tane olmak üzere üç iç içe ana sayfa oluşturacağız.We would then create three nested master pages, one for each type of web page. İç içe yerleştirilmiş her ana sayfa, ana sayfayı kullanan içerik sayfalarının türü arasındaki içeriği tanımlar.Each nested master page would define the content among the type of content pages that use the master page. Diğer bir deyişle, hasta 'e özgü içerik sayfaları için iç içe geçmiş ana sayfa, düzenlenmekte olan hasta hakkındaki bilgileri görüntülemek için biçimlendirme ve programlama mantığını içerir.In other words, the nested master page for patient-specific content pages would include markup and programmatic logic for displaying information about the patient being edited. Hasta 'e özgü yeni bir sayfa oluştururken onu bu iç içe geçmiş ana sayfaya bağlayacağız.When creating a new patient-specific page we would bind it to this nested master page.

Bu öğretici, iç içe yerleştirilmiş ana sayfaların avantajlarını vurgulayarak başlar.This tutorial starts by highlighting the benefits of nested master pages. Ardından, iç içe geçmiş ana sayfaların nasıl oluşturulacağını ve kullanılacağını gösterir.It then shows how to create and use nested master pages.

Note

.NET Framework sürüm 2,0 ' den beri iç içe yerleştirilmiş ana sayfalar mümkün.Nested master pages have been possible since version 2.0 of the .NET Framework. Ancak, Visual Studio 2005, iç içe geçmiş ana sayfalar için tasarım zamanı desteği içermiyordu.However, Visual Studio 2005 did not include design-time support for nested master pages. İyi haber, Visual Studio 2008 iç içe geçmiş ana sayfalar için zengin bir tasarım zamanı deneyimi sunuyor.The good news is that Visual Studio 2008 offers a rich design-time experience for nested master pages. İç içe geçmiş ana sayfalar kullanmak istiyorsanız, ancak hala Visual Studio 2005 kullanıyorsanız Scott Guthrie'nin blog girişine göz ATıN ve vs 2005 tasarım zamanında Iç Içe geçmiş ana sayfalar için ipuçlarıbulabilirsiniz.If you are interested in using nested master pages but are still using Visual Studio 2005, check out Scott Guthrie's blog entry, Tips for Nested Master Pages in VS 2005 Design-Time.

Iç Içe yerleştirilmiş ana sayfaların avantajlarıThe Benefits of Nested Master Pages

Birçok Web sitesinin Ayrıca, belirli sayfa türlerine özgü daha özelleştirilmiş tasarımlar ve çok sayıda site tasarımı vardır.Many websites have an overarching site design as well as more customized designs specific to certain types of pages. Örneğin, tanıtım Web uygulamamızda bir ilkel yönetim bölümü (~/Admin klasöründeki sayfalar) oluşturduk.For instance, in our demo web application we have created a rudimentary Administration section (the pages in the ~/Admin folder). Şu anda ~/Admin klasöründeki Web sayfaları, Yönetim bölümünde bulunmayan sayfalarla aynı ana sayfayı kullanır (yani, Site.master veya Alternate.masterkullanıcının seçimine bağlı olarak).Currently the web pages in the ~/Admin folder use the same master page as those pages not in the administration section (namely, Site.master or Alternate.master, depending on the user's selection).

Note

Şimdilik, sitemizin yalnızca bir ana sayfa Site.master.For now, pretend that our site has just one master page, Site.master. Bu öğreticinin ilerleyen kısımlarında "yönetim bölümü için Iç Içe yerleştirilmiş ana sayfa kullanma" ile başlayan iç içe yerleştirilmiş ana sayfaları kullanarak iki (veya daha fazla) Ana sayfa kullanın.We'll address using nested master pages with two (or more) master pages starting with "Using a Nested Master Page for the Administration Section" later in this tutorial.

Yönetim sayfalarının yerleşimini, diğer sayfalarda bulunmayan ek bilgileri veya bağlantıları içerecek şekilde özelleştirmenin sorulduğu hakkında düşünün.Imagine that we were asked to customize the layout of the Administration pages to include additional information or links that would not otherwise be present in other pages in the site. Bu gereksinimi uygulamak için dört teknik vardır:There are four techniques to implement this requirement:

  1. ~/Admin klasöründeki her içerik sayfasına yönetime özgü bilgileri ve bağlantıları el ile ekleyin.Manually add the Administration-specific information and links to every content page in the ~/Admin folder.
  2. Site.master ana sayfasını, Yönetim bölümüne özgü bilgileri ve bağlantıları içerecek şekilde güncelleştirin ve sonra yönetim sayfalarından birinin ziyaret edilip edilmeyeceğini temel alarak bu bölümleri göstermek veya gizlemek için ana sayfaya kod ekleyin.Update the Site.master master page to include the Administration section-specific information and links, and then add code to the master page to show or hide these sections based on whether one of the Administration pages is being visited.
  3. Özellikle Yönetim bölümünde yeni bir ana sayfa oluşturun, Site.masterbiçimlendirmesini kopyalayın, Yönetim bölümüne özgü bilgileri ve bağlantıları ekleyin ve ardından bu yeni ana sayfayı kullanmak için ~/Admin klasöründeki içerik sayfalarını güncelleştirin.Create a new master page specifically for the Administration section, copy over the markup from Site.master, add the Administration section-specific information and links, and then update the content pages in the ~/Admin folder to use this new master page.
  4. Site.master bağlanan ve ~/Admin klasördeki içerik sayfalarının bu yeni iç içe geçmiş ana sayfayı kullanmasını sağlayan bir iç içe ana sayfa oluşturun.Create a nested master page that binds to Site.master and have the content pages in the ~/Admin folder use this new nested master page. Bu iç içe yerleştirilmiş ana sayfa yalnızca yönetim sayfalarına özgü ek bilgileri ve bağlantıları içerir ve Site.masterzaten tanımlı biçimlendirmeyi tekrarlamanız gerekmez.This nested master page would include just the additional information and links specific to the Administration pages and would not need to repeat the markup already defined in Site.master.

İlk seçenek en az bir kez Damadır tablosudur.The first option is the least palatable. Ana sayfaları kullanmanın tam noktası, ortak biçimlendirmeyi el ile kopyalayıp yeni ASP.NET sayfalarına yapıştırmaya kadar uzaklaşmaktır.The whole point of using master pages is to move away from having to manually copy and paste common markup to new ASP.NET pages. İkinci seçenek kabul edilebilir, ancak uygulamanın ana sayfaları yalnızca bir zaman içinde görüntülenen işaretlerle kullandığından daha az bakım yapılmasını sağlar ve ana sayfayı düzenleyen geliştiricilerin bu biçimlendirme etrafında çalışmasını ve ne zaman hatırlamasını istiyorsanız, tam olarak, belirli bir biçimlendirme gizlenirse buna karşı görüntülenir.The second option is acceptable, but makes the application less maintainable as it bulks up the master pages with markup that is only occasionally displayed and requires developers editing the master page to work around this markup and to have to remember when, exactly, certain markup is displayed versus when it is hidden. Bu yaklaşım, bu tek ana sayfa tarafından sağlanmak için daha fazla ve daha fazla Web sayfası türünden özelleştirmeler için daha az kullanılabilir.This approach would be less tenable as customizations from more and more types of web pages needed to be accommodated by this single master page.

Üçüncü seçenek ikinci seçenekle ortaya çıkan dağınıklığı ve karmaşıklık sorunlarını ortadan kaldırır.The third option removes the clutter and complexity issues the surfaced with the second option. Ancak, üç ana dezavantajı seçeneği, Site.master ' den ortak düzeni kopyalayıp yeni yönetim bölümüne özgü ana sayfaya yapıştırmamızı gerektirmesidir.However, option three's main drawback is that it requires us to copy and paste the common layout from Site.master to the new Administration section-specific master page. Daha sonra site genelinde düzeni değiştirme kararı verirse, bunu iki yerde değiştirmeyi hatırladık.If we later decide to change the site-wide layout we have to remember to change it in two places.

Dördüncü seçenek olan iç içe yerleştirilmiş ana sayfalar bize ikinci ve üçüncü seçeneklerden en iyi şekilde erişmenizi sağlar.The fourth option, nested master pages, give us the best of the second and third options. Site genelinde düzen bilgileri bir dosyada tutulur-üst düzey ana sayfa-belirli bölgelere özgü içerik farklı dosyalara ayrılır.The site-wide layout information is maintained in one file - the top-level master page - while the content specific to particular regions is separated out into different files.

Bu öğretici basit bir iç içe geçmiş ana sayfa oluşturma ve kullanma konusunda bir görünüm ile başlar.This tutorial starts with a look at creating and using a simple nested master page. Yeni bir en üst düzey ana sayfa, iç içe geçmiş iki ana sayfa ve iki içerik sayfası oluşturacağız.We create a brand new top-level master page, two nested master pages, and two content pages. "Yönetim bölümünde Iç Içe yerleştirilmiş ana sayfa kullanma" ile başlayarak, iç içe yerleştirilmiş ana sayfaların kullanımını dahil etmek için mevcut ana sayfa mimarimizi güncelleştirme bölümüne baktık.Starting with "Using a Nested Master Page for the Administration Section," we look at updating our existing master page architecture to include the use of nested master pages. Özellikle, iç içe geçmiş ana sayfa oluşturur ve bu sayfayı, ~/Admin klasöründeki içerik sayfaları için ek özel içerik içerecek şekilde kullanır.Specifically, we create a nested master page and use it to include additional custom content for the content pages in the ~/Admin folder.

1. Adım: basit bir üst düzey ana sayfa oluşturmaStep 1: Creating a Simple Top-Level Master Page

Var olan ana sayfalardan birini temel alan iç içe bir ana sayfa oluşturma ve var olan içerik sayfası, üst düzey ana sayfa yerine bu yeni iç içe ana sayfanın kullanılması bazı karmaşıklıklar sağlar çünkü var olan içerik sayfaları zaten beklenirken Üst düzey ana sayfada tanımlanan ContentPlaceHolder denetimleri.Creating a nested master based on one of the existing master pages and then updating an existing content page to use this new nested master page instead of the top-level master page entails some complexity because the existing content pages already expect certain ContentPlaceHolder controls defined in the top-level master page. Bu nedenle, iç içe yerleştirilmiş ana sayfa aynı ada sahip aynı ContentPlaceHolder denetimlerini de içermelidir.Therefore, the nested master page must also include the same ContentPlaceHolder controls with the same names. Ayrıca, belirli tanıtım uygulamamız, Bu karmaşıklığa daha fazla eklenen bir kullanıcının tercihlerine bağlı olarak bir içerik sayfasına dinamik olarak atanan iki ana sayfaya (Site.master ve Alternate.master) sahiptir.Furthermore, our particular demo application has two master pages (Site.master and Alternate.master) that are dynamically assigned to a content page based on a user's preferences, which further adds to this complexity. Mevcut uygulamayı, bu öğreticide daha sonra iç içe geçmiş ana sayfaları kullanacak şekilde güncelleştirmeye bakacağız, ancak ilk olarak bir basit iç içe ana sayfa örneğine odaklanalım.We will look at updating the existing application to use nested master pages later in this tutorial, but let's first focus on a simple nested master pages example.

NestedMasterPages adlı yeni bir klasör oluşturun ve ardından Simple.masteradlı klasöre yeni bir ana sayfa dosyası ekleyin.Create a new folder named NestedMasterPages and then add a new master page file to that folder named Simple.master. (Bu klasör ve dosya eklendikten sonra Çözüm Gezgini ekran görüntüsü için Şekil 1 ' i inceleyin.) AlternateStyles.css stil sayfası dosyasını Çözüm Gezgini tasarımcı üzerine sürükleyin.(See Figure 1 for a screen shot of the Solution Explorer after this folder and file have been added.) Drag the AlternateStyles.css style sheet file from the Solution Explorer onto the Designer. Bu, ana sayfanın <head> öğe biçimlendirmesinin şöyle görünmesi için <head> öğesindeki stil sayfası dosyasına bir <link> öğesi ekler:This adds a <link> element to the style sheet file in the <head> element, after which the master page's <head> element's markup should look like:

<head runat="server"> 
 <title>Untitled Page</title> 
 <asp:ContentPlaceHolder id="head" runat="server"> 
 </asp:ContentPlaceHolder>
 <link href="../AlternateStyles.css" rel="stylesheet" type="text/css" /> 
</head>

Sonra, aşağıdaki biçimlendirmeyi Simple.masterWeb biçiminde ekleyin:Next, add the following markup within the Web Form of Simple.master:

<div id="topContent"> 
 <asp:HyperLink ID="lnkHome" runat="server" 
 NavigateUrl="~/NestedMasterPages/Default.aspx" 
 Text="Nested Master Pages Tutorial (Simple)" /> 
</div> 
<div id="mainContent"> 
 <asp:ContentPlaceHolder id="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
</div>

Bu biçimlendirme, sayfanın en üstünde yer alan "Iç Içe yerleştirilmiş ana sayfalar (basit)" adlı bir bağlantı görüntüleyerek bir Navy arka planında büyük bir beyaz yazı tipidir.This markup displays a link titled "Nested Master Pages (Simple)" at the top of the page in a large white font on a navy background. Bunun altında, MainContent ContentPlaceHolder.Beneath that is the MainContent ContentPlaceHolder. Şekil 1, Visual Studio tasarımcısında yüklendiğinde Simple.master ana sayfasını gösterir.Figure 1 shows the Simple.master master page when loaded in the Visual Studio Designer.

Iç Içe ana sayfa , yönetim bölümündeki sayfalara özgü Içeriği tanımlarThe Nested Master Page Defines Content Specific to the Pages in the Administration Section

Şekil 01: Iç Içe yerleştirilmiş ana sayfa, yönetim bölümündeki sayfalara özgü içeriği tanımlar (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 01: The Nested Master Page Defines Content Specific to the Pages in the Administration Section (Click to view full-size image)

2. Adım: basit bir Iç Içe ana sayfa oluşturmaStep 2: Creating a Simple Nested Master Page

Simple.master iki ContentPlaceHolder denetimi içerir: Web formu içine eklenen ve <head> öğesinde bulunan head ContentPlaceHolder ile birlikte MainContent ContentPlaceHolder.Simple.master contains two ContentPlaceHolder controls: the MainContent ContentPlaceHolder we added within the Web Form along with the head ContentPlaceHolder in the <head> element. Bir içerik sayfası oluşturmak ve bunu Simple.master bağlamanız durumunda, içerik sayfasında iki Contentbir yer tutucuyu başvuruda bulunan iki Içerik denetimi olacaktır.If we were to create a content page and bind it to Simple.master the content page would have two Content controls referencing the two ContentPlaceHolders. Benzer şekilde, iç içe geçmiş ana sayfa oluşturup Simple.master, iç içe yerleştirilmiş ana sayfanın iki Içerik denetimi olacaktır.Similarly, if we create a nested master page and bind it to Simple.master then the nested master page will have two Content controls.

SimpleNested.masteradlı NestedMasterPages klasöre yeni bir iç içe ana sayfa ekleyelim.Let's add a new nested master page to the NestedMasterPages folder named SimpleNested.master. NestedMasterPages klasöre sağ tıklayın ve yeni öğe Ekle ' yi seçin.Right-click on the NestedMasterPages folder and choose Add New Item. Bu, Şekil 2 ' de gösterilen yeni öğe Ekle iletişim kutusunu açar.This brings up the Add New Item dialog box shown in Figure 2. Ana sayfa şablonu türünü seçin ve yeni ana sayfanın adını yazın.Select the Master Page template type and type in the name of the new master page. Yeni ana sayfanın iç içe yerleştirilmiş bir ana sayfa olması gerektiğini göstermek için "Ana sayfa seç" onay kutusunu işaretleyin.To indicate that the new master page should be a nested master page, check the "Select master page" checkbox.

Sonra Ekle düğmesine tıklayın.Next, click the Add button. Bu, bir içerik sayfasını ana sayfaya bağlarken gördüğünüz ana sayfa Seç iletişim kutusunu görüntüler (bkz. Şekil 3).This will display the same Select a Master Page dialog box you see when binding a content page to a master page (see Figure 3). NestedMasterPages klasöründe Simple.master ana sayfasını seçin ve Tamam ' a tıklayın.Choose the Simple.master master page in the NestedMasterPages folder and click OK.

Note

Web sitesi proje modeli yerine Web uygulaması proje modelini kullanarak ASP.NET Web sitenizi oluşturduysanız Şekil 2 ' de gösterilen yeni öğe Ekle iletişim kutusunda "Ana sayfa seç" onay kutusunu görmezsiniz.If you created your ASP.NET website using the Web Application Project model instead of the Web Site Project model you will not see the "Select master page" checkbox in the Add New Item dialog box shown in Figure 2. Web uygulaması proje modelini kullanırken iç içe yerleştirilmiş bir ana sayfa oluşturmak için, Iç sayfa şablonunu (Ana sayfa şablonu yerine) seçmeniz gerekir.To create a nested master page when using the Web Application Project model you must choose the Nested Master Page template (instead of the Master Page template). Iç Içe geçmiş ana sayfa şablonunu seçtikten sonra Ekle ' ye tıkladığınızda, Şekil 3 ' te gösterilen aynı ana sayfa Seç iletişim kutusu görüntülenir.After selecting the Nested Master Page template and clicking Add, the same Select a Master Page dialog box shown in Figure 3 will appear.

Iç Içe geçmiş ana sayfa eklemek için "ana sayfa seçin" onay kutusunu işaretleyinCheck the "Select master page" Checkbox to Add a Nested Master Page

Şekil 02: Iç Içe geçmiş ana sayfa eklemek için "Ana sayfa seç" onay kutusunu işaretleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 02: Check the "Select master page" Checkbox to Add a Nested Master Page (Click to view full-size image)

Iç Içe yerleştirilmiş ana sayfayı basit. Master ana sayfasına bağlama Bind the Nested Master Page to the Simple.master Master Page

Şekil 03: Iç Içe ana sayfayı Simple.master ana sayfasına bağlama (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 03: Bind the Nested Master Page to the Simple.master Master Page (Click to view full-size image)

Aşağıda gösterilen iç içe ana sayfanın bildirime dayalı biçimlendirmesi, üst düzey ana sayfanın iki ContentPlaceHolder denetimine başvuran iki Içerik denetimini içerir.The nested master page's declarative markup, shown below, contains two Content controls referencing the top-level master page's two ContentPlaceHolder controls.

<%@ Master Language="VB" MasterPageFile="~/NestedMasterPages/Simple.master" AutoEventWireup="false" CodeFile="SimpleNested.master.vb" Inherits="NestedMasterPages_SimpleNested" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 </asp:Content>

<%@ Master %> yönergesi dışında, iç içe geçmiş ana sayfanın ilk bildirim temelli biçimlendirme biçimlendirmesi, bir içerik sayfasını aynı üst düzey ana sayfaya bağlarken başlangıçta oluşturulan biçimlendirmeyle aynıdır.Except for the <%@ Master %> directive, the nested master page's initial declarative markup is identical to the markup that is initially generated when binding a content page to the same top-level master page. Bir içerik sayfasının <%@ Page %> yönergesine benzer şekilde, <%@ Master %> yönergesi, iç içe yerleştirilmiş ana sayfanın üst ana sayfasını belirten bir MasterPageFile özniteliği içerir.Like a content page's <%@ Page %> directive, the <%@ Master %> directive here includes a MasterPageFile attribute that specifies the nested master page's parent master page. İç içe yerleştirilmiş ana sayfa ile aynı üst düzey ana sayfaya bağlanan bir içerik sayfası arasındaki temel fark, iç içe yerleştirilmiş ana sayfanın ContentPlaceHolder denetimlerini içeremeyeceği bir içeriktir.The main difference between the nested master page and a content page bound to the same top-level master page is that the nested master page can include ContentPlaceHolder controls. İç içe yerleştirilmiş ana sayfanın ContentPlaceHolder denetimleri, içerik sayfalarının biçimlendirmeyi özelleştirebileceği bölgeleri tanımlar.The nested master page's ContentPlaceHolder controls define the regions where the content pages can customize the markup.

Bu iç içe geçmiş ana sayfayı, "Merhaba, SimpleNested! öğesinden" metin görüntüleyecek şekilde güncelleştirinUpdate this nested master page so that it displays the text "Hello, from SimpleNested!" Içerik denetiminde MainContent ContentPlaceHolder denetimine karşılık gelir.in the Content control that corresponds to the MainContent ContentPlaceHolder control.

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 <p>Hello, from SimpleNested!</p>
</asp:Content>

Bu eklemeyi yaptıktan sonra, iç içe geçmiş ana sayfayı kaydedin ve sonra Default.aspxadlı NestedMasterPages klasöre yeni bir içerik sayfası ekleyin ve SimpleNested.master ana sayfasına bağlayın.After making this addition, save the nested master page and then add a new content page to the NestedMasterPages folder named Default.aspx, and bind it to the SimpleNested.master master page. Bu sayfayı ekledikten sonra hiç Içerik denetimi içerdiğini görmek için şaşırmış olabilirsiniz (bkz. Şekil 4)!Upon adding this page you may be surprised to see that it contains no Content controls (see Figure 4)! İçerik sayfası, yalnızca üst ana sayfanın içerik yertutucuları ile erişebilir.A content page can only access its parent master page's ContentPlaceHolders. SimpleNested.master ContentPlaceHolder denetimi içermez; Bu nedenle, bu ana sayfaya bağlantılı tüm içerik sayfaları Içerik denetimleri içeremez.SimpleNested.master does not contain any ContentPlaceHolder controls; therefore, any content page bound to this master page cannot contain any Content controls.

Yeni Içerik sayfası, Içerik denetimi içermiyor The New Content Page Contains No Content Controls

Şekil 04: yeni Içerik sayfası içerik denetimi içermiyor (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 04: The New Content Page Contains No Content Controls (Click to view full-size image)

Yapmanız gerekenler, iç içe yerleştirilmiş ana sayfayı (SimpleNested.master) ContentPlaceHolder denetimlerini içerecek şekilde güncelleştiririz.What we need to do is update the nested master page (SimpleNested.master) to include ContentPlaceHolder controls. Genellikle, iç içe yerleştirilmiş ana sayfalarınızın üst ana sayfası tarafından tanımlanan her bir ContentPlaceHolder için bir ContentPlaceHolder içermesini, böylece alt ana sayfa veya içerik sayfasının üst düzey ana sayfanın ContentPlaceHolder ile çalışmasına izin vermesini isteyeceksiniz kontrollerini.Typically you'll want your nested master pages to include a ContentPlaceHolder for each ContentPlaceHolder defined by its parent master page, thereby allowing its child master page or content page to work with any of the top-level master page's ContentPlaceHolder controls.

SimpleNested.master ana sayfasını, iki Içerik denetimine bir ContentPlaceHolder içerecek şekilde güncelleştirin.Update the SimpleNested.master master page to include a ContentPlaceHolder in its two Content controls. ContentPlaceHolder denetimlerine, Içerik denetiminin başvurduğu ContentPlaceHolder denetimiyle aynı adı verin.Give the ContentPlaceHolder controls the same name as the ContentPlaceHolder control their Content control refers to. Diğer bir deyişle, Simple.masteriçindeki MainContent ContentPlaceHolder öğesine başvuran SimpleNested.master Içerik denetimine MainContent adlı bir ContentPlaceHolder denetimi ekleyin.That is, add a ContentPlaceHolder control named MainContent to the Content control in SimpleNested.master that references the MainContent ContentPlaceHolder in Simple.master. Içerik denetimindeki head ContentPlaceHolder öğesine başvuran aynı şeyi yapın.Do the same thing in the Content control that references the head ContentPlaceHolder.

Note

İç içe ana sayfadaki ContentPlaceHolder denetimlerinin, üst düzey ana sayfadaki Contentyertutucuları ile aynı şekilde adlandırılması önerdiğimde, bu adlandırma simetriyi gerekli değildir.While I recommend naming the ContentPlaceHolder controls in the nested master page the same as the ContentPlaceHolders in the top-level master page, this naming symmetry is not required. İç içe yerleştirilmiş ana sayfanızda ContentPlaceHolder denetimlerine dilediğiniz adı verebilirsiniz.You can give the ContentPlaceHolder controls in your nested master page any name you like. Bununla birlikte, en üst düzey ana sayfam ve iç içe yerleştirilmiş ana sayfalar aynı adları kullanıyorsa, sayfanın hangi bölgelerine karşılık geldiğini unutmayı daha kolay buldum.However, I find it easier to remember what ContentPlaceHolders correspond with what regions of the page if my top-level master page and nested master pages use the same names.

Bu eklemeleri yaptıktan sonra SimpleNested.master ana sayfanızın bildirim temelli biçimlendirmesinin aşağıdakine benzer şekilde görünmesi gerekir:After making these additions your SimpleNested.master master page's declarative markup should look similar to the following:

<%@ Master Language="VB" MasterPageFile="~/NestedMasterPages/Simple.master" AutoEventWireup="false" CodeFile="SimpleNested.master.vb" Inherits="NestedMasterPages_SimpleNested" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
 <asp:ContentPlaceHolder ID="head" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 <p>Hello, from SimpleNested!</p>
 <asp:ContentPlaceHolder ID="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content>

Yeni oluşturduğumuz Default.aspx içerik sayfasını silin ve sonra yeniden ekleyin ve SimpleNested.master ana sayfasına bağlamanız gerekir.Delete the Default.aspx content page we just created and then re-add it, binding it to the SimpleNested.master master page. Bu kez, Visual Studio Default.aspx, artık SimpleNested.master tanımlanmış olan Contentyertutucuları ile başvurulan iki Içerik denetimini ekler (bkz. Şekil 6).This time Visual Studio adds two Content controls to the Default.aspx, referencing the ContentPlaceHolders now defined in SimpleNested.master (see Figure 6). "Hello, default. aspx!" metnini ekleyinAdd the text, "Hello, from Default.aspx!" MainContentbaşvurulan Içerik denetiminde.in the Content control that referenced MainContent.

Şekil 5 ' te yer alan üç varlık (Simple.master, SimpleNested.masterve Default.aspx, birbirleriyle birbirleriyle nasıl ilişkili olduğu gösterilmektedir.Figure 5 shows the three entities involved here - Simple.master, SimpleNested.master, and Default.aspx - and how they relate to one another. Diyagramda gösterildiği gibi, iç içe yerleştirilmiş ana sayfa üst öğesinin ContentPlaceHolder için Içerik denetimleri uygular.As the diagram shows, the nested master page implements Content controls for its parent's ContentPlaceHolder. Bu bölgelerin içerik sayfasında erişilebilir olması gerekiyorsa, iç içe yerleştirilmiş ana sayfanın Içerik denetimlerine kendi Contentyertutucuları eklemesi gerekir.If these regions need to be accessible to the content page, the nested master page must add its own ContentPlaceHolders to the Content controls.

Üst düzey ve Iç Içe yerleştirilmiş ana sayfaların , Içerik sayfasının yerleşimini dikteThe Top-Level and Nested Master Pages Dictate the Content Page's Layout

Şekil 05: en üst düzey ve Iç Içe yerleştirilmiş ana sayfalar Içerik sayfasının yerleşimini (tam boyutlu görüntüyü görüntülemek için tıklatın)Figure 05: The Top-Level and Nested Master Pages Dictate the Content Page's Layout (Click to view full-size image)

Bu davranış, bir içerik sayfası veya ana sayfanın yalnızca üst ana sayfasının bilmi olduğunu gösterir.This behavior illustrates how a content page or master page is only cognizant of its parent master page. Bu davranış, Visual Studio Tasarımcısı tarafından da belirtilir.This behavior is also indicated by the Visual Studio Designer. Şekil 6 Default.aspxiçin tasarımcıyı gösterir.Figure 6 shows the Designer for Default.aspx. Tasarımcı içerik sayfasından hangi bölgelerin düzenlenebilir olduğunu ve bunların ne tür olduğunu açıkça gösterirken, düzenlenemeyen bölgelerin iç içe yerleştirilmiş ana sayfadan ve en üst düzey ana sayfadan hangi bölgelerde olduğunu belirsizliğini engellemez.While the Designer clearly shows what regions are editable from the content page and what portions aren't, it doesn't disambiguate what non-editable regions are from the nested master page and what regions are from the top-level master page.

Içerik sayfası artık Iç Içe yerleştirilmiş ana sayfanın Contentyertutucuları için Içerik denetimleri IçeriyorThe Content Page Now Includes Content Controls for the Nested Master Page's ContentPlaceHolders

Şekil 06: Içerik sayfası artık Iç Içe yerleştirilmiş ana sayfanın contentyertutucuları Için Içerik denetimleri içeriyor (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 06: The Content Page Now Includes Content Controls for the Nested Master Page's ContentPlaceHolders (Click to view full-size image)

3. Adım: Ikinci bir basit Iç Içe geçmiş ana sayfa eklemeStep 3: Adding a Second Simple Nested Master Page

Birden çok iç içe yerleştirilmiş ana sayfa olduğunda, iç içe yerleştirilmiş ana sayfaların avantajı daha fazla belirlenir.The benefit of nested master pages is more evident when there are multiple nested master pages. Bu avantajı göstermek için NestedMasterPages klasöründe başka bir iç içe ana sayfa oluşturun; Bu yeni iç içe geçmiş ana sayfayı SimpleNestedAlternate.master adlandırın ve Simple.master ana sayfasına bağlayın.To illustrate this benefit, create another nested master page in the NestedMasterPages folder; name this new nested master page SimpleNestedAlternate.master and bind it to the Simple.master master page. İç içe yerleştirilmiş ana sayfanın ikinci Içerik denetimlerine 2. adım yaptığımız gibi ContentPlaceHolder denetimleri ekleyin.Add ContentPlaceHolder controls in the nested master page's two Content controls like we did in Step 2. Ayrıca "Merhaba, SimpleNestedAlternate!" metnini ekleyinAlso add the text, "Hello, from SimpleNestedAlternate!" üst düzey ana sayfanın MainContent ContentPlaceHolder öğesine karşılık gelen Içerik denetiminde.in the Content control that corresponds to the top-level master page's MainContent ContentPlaceHolder. Bu değişiklikleri yaptıktan sonra, yeni iç içe ana sayfanın bildirim temelli biçimlendirmesinin aşağıdakine benzer şekilde görünmesi gerekir:After making these changes your new nested master page's declarative markup should look similar to the following:

<%@ Master Language="VB" MasterPageFile="~/NestedMasterPages/Simple.master" AutoEventWireup="false" CodeFile="SimpleNestedAlternate.master.vb" Inherits="NestedMasterPages_SimpleNestedAlternate" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
 <asp:ContentPlaceHolder ID="head" runat="server">
 </asp:ContentPlaceHolder> </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
 <p>Hello, from SimpleNestedAlternate!</p> 
 <asp:ContentPlaceHolder ID="MainContent" runat="server">
 </asp:ContentPlaceHolder> 
 </asp:Content>

NestedMasterPages klasöründe Alternate.aspx adlı bir içerik sayfası oluşturun ve SimpleNestedAlternate.master iç içe ana sayfaya bağlayın.Create a content page named Alternate.aspx in the NestedMasterPages folder and bind it to the SimpleNestedAlternate.master nested master page. "Merhaba, diğer!" metnini ekleyinAdd the text, "Hello, from Alternate!" MainContentkarşılık gelen Içerik denetiminde.in the Content control that corresponds to MainContent. Şekil 7 ' de, Visual Studio Tasarımcısı aracılığıyla görüntülendiğinde Alternate.aspx gösterilmektedir.Figure 7 shows Alternate.aspx when viewed through the Visual Studio Designer.

alternatif. aspx, SimpleNestedAlternate. Master ana sayfasına bağlanırAlternate.aspx is Bound to the SimpleNestedAlternate.master Master Page

Şekil 07: Alternate.aspx SimpleNestedAlternate.master ana sayfasına bağlanır (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 07: Alternate.aspx is Bound to the SimpleNestedAlternate.master Master Page (Click to view full-size image)

Şekil 7 ' deki tasarımcıyı Şekil 6 ' da tasarımcı ile karşılaştırın.Compare the Designer in Figure 7 to the Designer in Figure 6. Her iki içerik sayfası da üst düzey ana sayfada (Simple.master) tanımlanan düzeni paylaşır, yani "Iç Içe geçmiş ana sayfalar öğreticisi (basit)" başlığı.Both content pages share the same layout defined in the top-level master page (Simple.master), namely the "Nested Master Pages Tutorial (Simple)" title. Ancak her ikisi de üst ana sayfalarında tanımlı farklı içeriğe sahiptir-"Hello, SimpleNested öğesinden" metni "Yet both have distinct content defined in their parent master pages - the text "Hello, from SimpleNested!" Şekil 6 ' da ve "Merhaba, SimpleNestedAlternate!"in Figure 6 and "Hello, from SimpleNestedAlternate!" Şekil 7 ' de.in Figure 7. Bu farklar önemsiz, ancak daha anlamlı farklılıklar içermesi için bu örnek genişletebilirsiniz.Granted, these differences here are trivial, but you could extend this example to include more meaningful differences. Örneğin, SimpleNested.master sayfasında içerik sayfalarına özgü seçeneklere sahip bir menü bulunabilir, ancak SimpleNestedAlternate.master, bu sayfaya bağlanan içerik sayfaları ile ilgili bilgiler içerebilir.For instance, the SimpleNested.master page might include a menu with options specific to its content pages, whereas SimpleNestedAlternate.master might have information pertinent to the content pages that bind to it.

Şimdi, site düzeninde daha fazla değişiklik yapmak için gerekdiğimiz hakkında düşünün.Now, imagine that we needed to make a change to the overarching site layout. Örneğin, tüm içerik sayfalarına ortak bağlantıların bir listesini eklemek istediğimizde düşünün.For example, imagine that we wanted to add a list of common links to all content pages. Bunu gerçekleştirmek için üst düzey ana sayfayı güncelleştireceğiz Simple.master.To accomplish this we update the top-level master page, Simple.master. Tüm değişiklikler, iç içe geçmiş ana sayfalarına ve uzantıya göre içerik sayfalarına hemen yansıtılır.Any changes there are immediately reflected in its nested master pages and, by extension, their content pages.

Kapsamlı site yerleşimini değiştirediğimiz kolaylığınızı göstermek için Simple.master ana sayfasını açın ve topContent ve mainContent <div> öğeleri arasında aşağıdaki biçimlendirmeyi ekleyin:To demonstrate the ease with which we can change the overarching site layout, open the Simple.master master page and add the following markup between the topContent and mainContent <div> elements:

<div id="navContent"> 
 <asp:HyperLink ID="lnkDefault" runat="server" 
 NavigateUrl="~/NestedMasterPages/Default.aspx" 
 Text="Nested Master Page Example 1" /> 
 | 
 <asp:HyperLink ID="lnkAlternate" runat="server" 
 NavigateUrl="~/NestedMasterPages/Alternate.aspx" 
 Text="Nested Master Page Example 2" /> 
</div>

Bu, Simple.master, SimpleNested.masterveya SimpleNestedAlternate.masterbağlanan her sayfanın üst kısmına iki bağlantı ekler; Bu değişiklikler, iç içe geçmiş ana sayfalara ve bunların içerik sayfalarına hemen uygulanır.This adds two links to the top of every page that binds to Simple.master, SimpleNested.master, or SimpleNestedAlternate.master; these changes apply to all nested master pages and their content pages immediately. Şekil 8 ' de bir tarayıcıdan görüntülendiklerinde Alternate.aspx gösterilmektedir.Figure 8 shows Alternate.aspx when viewed through a browser. Sayfanın üst kısmındaki bağlantıların eklenmesine (Şekil 7 ' ye kıyasla) göz önünde.Note the addition of the links at the top of the page (compared to Figure 7).

En üst düzey ana sayfa olarak değiştirilen , Iç Içe yerleştirilmiş ana sayfalara ve bunların Içerik sayfalarına hemen yansıtılırChanged to the Top-Level Master Page are Immediately Reflected in its Nested Master Pages and Their Content Pages

Şekil 08: en üst düzey ana sayfa olarak değiştirme, Iç Içe geçmiş ana sayfalarında ve bunların Içerik sayfalarında hemen yansıtılır (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 08: Changed to the Top-Level Master Page are Immediately Reflected in its Nested Master Pages and Their Content Pages (Click to view full-size image)

Yönetim bölümü için Iç Içe geçmiş ana sayfa kullanmaUsing a Nested Master Page for the Administration Section

Bu noktada, iç içe geçmiş ana sayfaların avantajlarını inceledik ve bunları nasıl oluşturup bir ASP.NET uygulamasında kullanacağınızı gördünüz.At this point we have looked at the advantages of nested master pages and have seen how to create and use them in an ASP.NET application. 1, 2 ve 3. adımlarda, bununla birlikte yeni bir üst düzey ana sayfa, yeni iç içe ana sayfa ve yeni içerik sayfaları oluşturma dahil olmak üzere örnekler.The examples in Steps 1, 2, and 3, however, involved creating a new top-level master page, new nested master pages, and new content pages. Var olan üst düzey ana sayfa ve içerik sayfalarıyla bir Web sitesine yeni bir iç içe ana sayfa ekleme hakkında ne olacak?What about adding a new nested master page to a website with an existing top-level master page and content pages?

İç içe yerleştirilmiş ana sayfayı var olan bir Web sitesiyle tümleştirme ve var olan içerik sayfalarıyla ilişkilendirme, sıfırdan başlayarak biraz daha fazla çaba gerektirir.Integrating a nested master page into an existing website and associating it with existing content pages requires a bit more effort than starting from scratch. 4, 5, 6 ve 7. adım, yönetim yönergelerini içeren AdminNested.master adlı yeni bir iç içe ana sayfa eklemek için tanıtım uygulamamızı geliştirdik ve ~/Admin klasöründeki ASP.NET sayfaları tarafından kullanılır.Steps 4, 5, 6, and 7 explore these challenges as we augment our demo application to include a new nested master page named AdminNested.master that contains instructions for the administrator and is used by the ASP.NET pages in the ~/Admin folder.

İç içe yerleştirilmiş ana sayfayı tanıtım uygulamamızda tümleştirmek aşağıdaki acecüleri tanıtır:Integrating a nested master page into our demo application introduces the following hurdles:

  • ~/Admin klasöründeki mevcut içerik sayfaları, ana sayfalarından belirli beklentiler.The existing content pages in the ~/Admin folder have certain expectations from their master page. Başlangıçlar için bazı ContentPlaceHolder denetimlerinin mevcut olmasını bekler.For starters, they expect certain ContentPlaceHolder controls to be present. Ayrıca, ~/Admin/AddProduct.aspx ve ~/Admin/Products.aspx sayfaları ana sayfanın ortak RefreshRecentProductsGrid yöntemini çağırır, GridMessageText özelliğini ayarlar veya PricesDoubled olayı için bir olay işleyicisine sahiptir.Furthermore, the ~/Admin/AddProduct.aspx and ~/Admin/Products.aspx pages call the master page's public RefreshRecentProductsGrid method, set its GridMessageText property, or have an event handler for its PricesDoubled event. Sonuç olarak, iç içe geçmiş ana sayfamız aynı Contentyertutucuları ve ortak üyeleri sağlamalıdır.Consequently, our nested master page must provide the same ContentPlaceHolders and public members.
  • Önceki öğreticide, bir oturum değişkenine göre Page nesnesinin MasterPageFile özelliğini dinamik olarak ayarlamak için BasePage sınıfını geliştirdik.In the preceding tutorial we enhanced the BasePage class to dynamically set the Page object's MasterPageFile property based on a Session variable. İç içe geçmiş ana sayfalar kullanılırken dinamik ana sayfaları destekliyoruz?How to we support dynamic master pages when using nested master pages?

Bu iki zorluk, iç içe geçmiş ana sayfa oluşturduğumuzdan ve var olan içerik sayfalarımızdan kullanıldığı sürece yüzeyidir.These two challenges will surface as we build the nested master page and use it from our existing content pages. Bu sorunları ortaya çıktığında araştırıp bağlayacağız.We'll investigate and surmount these issues as they arise.

4. Adım: Iç Içe geçmiş ana sayfa oluşturmaStep 4: Creating the Nested Master Page

İlk göreviniz, yönetim bölümündeki sayfalar tarafından kullanılacak iç içe yerleştirilmiş ana sayfayı oluşturmaktır.Our first task is to create the nested master page to be used by the pages in the Administration section. 2. adımda gördüğümüz gibi, iç içe yerleştirilmiş ana sayfanın üst ana sayfasını belirtmemiz gereken yeni bir iç içe ana sayfa eklenirken.As we saw in Step 2, when adding a new nested master page we need to specify the nested master page's parent master page. Ancak en üst düzey iki ana sayfanız vardır: Site.master ve Alternate.master.But we have two top-level master pages: Site.master and Alternate.master. Önceki öğreticide Alternate.master oluşturduğumuz ve BasePage sınıfında, çalışma zamanında Page nesnesinin MasterPageFile özelliğini Site.master oturum değişkeninin değerine bağlı olarak Alternate.master veya MyMasterPage olarak belirten kodu yazdığımızda geri çekin.Recall that we created Alternate.master in the preceding tutorial and wrote code in the BasePage class that set the Page object's MasterPageFile property at runtime to either Site.master or Alternate.master depending on the value of the MyMasterPage Session variable.

İç içe geçmiş ana sayfamızı, uygun üst düzey ana sayfayı kullanacak şekilde nasıl yapılandıracağız?How do we configure our nested master page so that it uses the appropriate top-level master page? İki seçeneğiniz vardır:We have two options:

  • İki iç içe geçmiş ana sayfa oluşturun, AdminNestedSite.master ve AdminNestedAlternate.masterve bunları sırasıyla en üst düzey ana sayfalara Site.master ve Alternate.masterbağlayın.Create two nested master pages, AdminNestedSite.master and AdminNestedAlternate.master, and bind them to the top-level master pages Site.master and Alternate.master, respectively. BasePage, Page nesnesinin MasterPageFile uygun iç içe ana sayfaya ayarlayacağız.In BasePage, then, we'd set the Page object's MasterPageFile to the appropriate nested master page.
  • Tek bir iç içe geçmiş ana sayfa oluşturun ve içerik sayfalarında bu özel ana sayfayı kullanın.Create a single nested master page and have the content pages use this particular master page. Sonra, çalışma zamanında, iç içe yerleştirilmiş ana sayfanın MasterPageFile özelliğini çalışma zamanında uygun en üst düzey ana sayfaya ayarlamanız gerekir.Then, at runtime, we'd need to set the nested master page's MasterPageFile property to the appropriate top-level master page at runtime. (Şu anda iletişime, ana sayfaların da bir MasterPageFile özelliği vardır.)(As you might have figured out by now, master pages also have a MasterPageFile property.)

İkinci seçeneği kullanalım.Let's use the second option. AdminNested.masteradlı ~/Admin klasöründe tek bir iç içe geçmiş ana sayfa dosyası oluşturun.Create a single nested master page file in the ~/Admin folder named AdminNested.master. Hem Site.master hem de Alternate.master aynı ContentPlaceHolder denetim kümesine sahip olduğundan, bu, hangi ana sayfayı bağladıkınızın önemi yoktur, ancak bunu tutarlılığın sake için Site.master bağlamanız önerilir.Because both Site.master and Alternate.master have the same set of ContentPlaceHolder controls, it doesn't matter what master page you bind it to, although I encourage you to bind it to Site.master for consistency's sake.

~/Admin klasörüne Iç Içe geçmiş ana sayfa eklemek .Add a Nested Master Page to the ~/Admin Folder.

Şekil 09: ~/Admin klasöre Iç Içe geçmiş ana sayfa ekleyin.Figure 09: Add a Nested Master Page to the ~/Admin Folder. (Tam boyutlu görüntüyü görüntülemek Için tıklayın)(Click to view full-size image)

İç içe yerleştirilmiş ana sayfa dört ContentPlaceHolder denetimine sahip bir ana sayfaya bağlandığı için, Visual Studio yeni iç içe ana sayfa dosyasının ilk biçimlendirmesine dört Içerik denetimi ekler.Because the nested master page is bound to a master page with four ContentPlaceHolder controls, Visual Studio adds four Content controls to the new nested master page file's initial markup. 2 ve 3. adımlarda yaptığımız gibi, her Içerik denetimine bir ContentPlaceHolder denetimi ekleyerek üst düzey ana sayfanın ContentPlaceHolder denetimiyle aynı adı vermiş olursunuz.Like we did in Steps 2 and 3, add a ContentPlaceHolder control in each Content control, giving it the same name as the top-level master page's ContentPlaceHolder control. Ayrıca, MainContent ContentPlaceHolder öğesine karşılık gelen Içerik denetimine aşağıdaki biçimlendirmeyi ekleyin:Also add the following markup to the Content control that corresponds to the MainContent ContentPlaceHolder:

<div class="instructions"> 
 <b>Administration Instructions:</b>
 <br /> 
 The pages in the Administration section allow you, the Administrator, to 
 add new products and view existing products. 
</div>

Sonra, Styles.css ve AlternateStyles.css CSS dosyalarında instructions CSS sınıfını tanımlayın.Next, define the instructions CSS class in the Styles.css and AlternateStyles.css CSS files. Aşağıdaki CSS kuralları, açık sarı arka plan rengi ve siyah, düz kenarlık ile görüntülenmek üzere instructions sınıfıyla biçimlendirilmiş HTML öğelerine neden olur:The following CSS rules cause HTML elements styled with the instructions class to be displayed with a light yellow background color and a black, solid border:

.instructions 
{
 padding: 6px; 
 border: dashed 1px black; 
 background-color: #ffb; 
 margin-bottom: 10px; 
}

Bu işaretleme, iç içe yerleştirilmiş ana sayfaya eklendiğinden, yalnızca bu iç içe ana sayfayı kullanan sayfalarda görünür (yani, yönetim bölümündeki sayfalar).Because this markup has been added to the nested master page, it will only appear in those pages that use this nested master page (namely, the pages in the Administration section).

İç içe geçmiş ana sayfanıza Bu eklemeleri yaptıktan sonra, bildirim temelli biçimlendirme aşağıdakine benzer olmalıdır:After making these additions to your nested master page, its declarative markup should look similar to the following:

<%@ Master Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="AdminNested.master.vb" Inherits="Admin_AdminNested" %> 
 <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
 <asp:ContentPlaceHolder ID="head" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 
 <div class="instructions">
 <b>Administration Instructions:</b>
 <br /> 
 The pages in the Administration section allow you, the Administrator, to 
 add new products and view existing products. 
 </div>
 <asp:ContentPlaceHolder ID="MainContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content3" ContentPlaceHolderID="QuickLoginUI" Runat="Server"> 
 <asp:ContentPlaceHolder ID="QuickLoginUI" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content> 
 <asp:Content ID="Content4" ContentPlaceHolderID="LeftColumnContent" Runat="Server"> 
 <asp:ContentPlaceHolder ID="LeftColumnContent" runat="server"> 
 </asp:ContentPlaceHolder>
 </asp:Content>

Her Içerik denetiminin bir ContentPlaceHolder denetimine sahip olduğunu ve ContentPlaceHolder denetimlerinin ' ID özelliklerinin en üst düzey ana sayfadaki ilgili ContentPlaceHolder denetimleriyle aynı değerleri atandığını unutmayın.Note that each Content control has a ContentPlaceHolder control and that the ContentPlaceHolder controls' ID properties are assigned the same values as the corresponding ContentPlaceHolder controls in the top-level master page. Üstelik, Yönetim bölümüne özgü biçimlendirme MainContent ContentPlaceHolder ' da görünür.Moreover, the Administration section-specific markup appears in the MainContent ContentPlaceHolder.

Şekil 10 ' da, Visual Studio 'nun Tasarımcısı aracılığıyla görüntülendiğinde iç içe geçmiş ana sayfa AdminNested.master gösterilmektedir.Figure 10 shows the AdminNested.master nested master page when viewed through Visual Studio's Designer. Yönergeleri MainContent Içerik denetiminin en üstündeki sarı kutuda görebilirsiniz.You can see the instructions in the yellow box at the top of the MainContent Content control.

Iç Içe geçmiş ana sayfa , yönetici için yönergeler Içerecek şekilde üst düzey ana sayfayı genişletir.The Nested Master Page Extends the Top-Level Master Page to Include Instructions for the Administrator.

Şekil 10: Iç Içe yerleştirilmiş ana sayfa, yönetici Için yönergeler Içerecek şekilde üst düzey ana sayfayı genişletir.Figure 10: The Nested Master Page Extends the Top-Level Master Page to Include Instructions for the Administrator. (Tam boyutlu görüntüyü görüntülemek Için tıklayın)(Click to view full-size image)

5. Adım: var olan Içerik sayfalarını yeni Iç Içe geçmiş ana sayfayı kullanmak üzere güncelleştirmeStep 5: Updating the Existing Content Pages to Use the New Nested Master Page

Yönetim bölümüne yeni bir içerik sayfası eklediğimiz her zaman, onu yeni oluşturduğumuz AdminNested.master ana sayfaya bağlamanız gerekir.Anytime we add a new content page to the Administration section we need to bind it to the AdminNested.master master page we just created. Ancak var olan içerik sayfaları ne kadar?But what about the existing content pages? Şu anda sitedeki tüm içerik sayfaları, çalışma zamanında içerik sayfasının ana sayfasını programlı bir şekilde ayarlayan BasePage sınıfından türetilir.Currently, all content pages in the site derive from the BasePage class, which programmatically sets the content page's master page at runtime. Bu, yönetim bölümündeki içerik sayfaları için istediğimiz davranış değildir.This is not the behavior we want for the content pages in the Administration section. Bunun yerine, bu içerik sayfalarının AdminNested.master sayfasını her zaman kullanmasını istiyoruz.Instead, we want these content pages to always use the AdminNested.master page. Çalışma zamanında sağ üst düzey içerik sayfasını seçmek için iç içe yerleştirilmiş ana sayfanın sorumluluğu olacaktır.It will be the responsibility of the nested master page to choose the right top-level content page at runtime.

Bu istenen davranışı elde etmenin en iyi yolu, BasePage sınıfını genişleten AdminBasePage adlı yeni bir özel taban sayfa sınıfı oluşturmaktır.To best way to achieve this desired behavior is to create a new custom base page class named AdminBasePage that extends the BasePage class. AdminBasePage daha sonra SetMasterPageFile geçersiz kılabilir ve Page nesnesinin MasterPageFile "~/Admin/AdminNested.master" sabit kodlanmış değerine ayarlayabilir.AdminBasePage can then override the SetMasterPageFile and set the Page object's MasterPageFile to the hard-coded value "~/Admin/AdminNested.master". Bu şekilde, AdminBasePage türetilen tüm sayfalar AdminNested.masterkullanacaktır, ancak MasterPageFile BasePage türetilen herhangi bir sayfa MyMasterPage oturum değişkeninin değerine bağlı olarak "~/site.exe ana" veya "~/Alternate.exe ana" olarak ayarlanır.In this way, any page that derives from AdminBasePage will use AdminNested.master, whereas any page that derives from BasePage will have its MasterPageFile property set dynamically to either "~/Site.master" or "~/Alternate.master" based on the value of the MyMasterPage Session variable.

AdminBasePage.vbadlı App_Code klasöre yeni bir sınıf dosyası ekleyerek başlayın.Start by adding a new class file to the App_Code folder named AdminBasePage.vb. BasePage genişletecek AdminBasePage ve ardından SetMasterPageFile yöntemini geçersiz kılarsınız.Have AdminBasePage extend BasePage and then override the SetMasterPageFile method. Bu yöntemde, "~/Admin/AdminNested.master" değerini MasterPageFile atayın.In that method assign the MasterPageFile the value "~/Admin/AdminNested.master". Bu değişiklikleri yaptıktan sonra sınıf dosyanız aşağıdakine benzer şekilde görünmelidir:After making these changes your class file should look similar to the following:

Public Class AdminBasePage 
 Inherits BasePage 
 Protected Overrides Sub SetMasterPageFile() 
 Me.MasterPageFile = "~/Admin/AdminNested.master" 
 End Sub 
End Class

Artık, Yönetim bölümünde bulunan içerik sayfalarının BasePageyerine AdminBasePage türetmemiz gerekir.We now need to have the existing content pages in the Administration section derive from AdminBasePage instead of BasePage. ~/Admin klasöründeki her içerik sayfası için arka plan kod dosyasına gidin ve bu değişikliği yapın.Go to the code-behind class file for each content page in the ~/Admin folder and make this change. Örneğin ~/Admin/Default.aspx ' de, arka plan kod sınıfı bildirimini öğesinden değiştirirsiniz:For example, in ~/Admin/Default.aspx you'd change the code-behind class declaration from:

Partial Class Admin_Default 
 Inherits BasePage

Hedef:To:

Partial Class Admin_Default 
 Inherits AdminBasePage

Şekil 11 üst düzey ana sayfanın (Site.master veya Alternate.master), iç içe geçmiş ana sayfanın (AdminNested.master) ve yönetim bölümü içerik sayfalarının birbiriyle ilişkisini gösterir.Figure 11 depicts how the top-level master page (Site.master or Alternate.master), the nested master page (AdminNested.master), and the Administration section content pages relate to one another.

Iç Içe ana sayfa , yönetim bölümündeki sayfalara özgü Içeriği tanımlarThe Nested Master Page Defines Content Specific to the Pages in the Administration Section

Şekil 11: Iç Içe yerleştirilmiş ana sayfa, yönetim bölümündeki sayfalara özgü içeriği tanımlar (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 11: The Nested Master Page Defines Content Specific to the Pages in the Administration Section (Click to view full-size image)

6. Adım: ana sayfanın ortak yöntemlerini ve özelliklerini yansıtmaStep 6: Mirroring the Master Page's Public Methods and Properties

~/Admin/AddProduct.aspx ve ~/Admin/Products.aspx sayfalarının ana sayfayla programlı olarak etkileşimde bulunduğunu hatırlayın: ~/Admin/AddProduct.aspx ana sayfanın ortak RefreshRecentProductsGrid yöntemini çağırır ve onun GridMessageText özelliğini ayarlıyor; ~/Admin/Products.aspx, PricesDoubled olayı için bir olay işleyicisine sahiptir.Recall that the ~/Admin/AddProduct.aspx and ~/Admin/Products.aspx pages interact programmatically with the master page: ~/Admin/AddProduct.aspx calls the master page's public RefreshRecentProductsGrid method and sets its GridMessageText property; ~/Admin/Products.aspx has an event handler for the PricesDoubled event. Önceki öğreticide, bu genel üyeleri tanımlayan bir MustInherit BaseMasterPage sınıfı oluşturduk.In the preceding tutorial we created a MustInherit BaseMasterPage class that defined these public members.

~/Admin/AddProduct.aspx ve ~/Admin/Products.aspx sayfaları, ana sayfalarının BaseMasterPage sınıfından türediği varsayılır.The ~/Admin/AddProduct.aspx and ~/Admin/Products.aspx pages assume that their master page derives from the BaseMasterPage class. Ancak AdminNested.master sayfası şu anda System.Web.UI.MasterPage sınıfını genişletiyor.The AdminNested.master page, however, currently extends the System.Web.UI.MasterPage class. Sonuç olarak, ~/Admin/Products.aspx ziyaret edildiğinde InvalidCastException şu iletiyle oluşturulur: "' ASP. admin_adminnested_Master ' türündeki nesne ' BaseMasterPage ' türüne yayınlanamıyor."As a result, when visiting ~/Admin/Products.aspx an InvalidCastException is thrown with the message: "Unable to cast object of type 'ASP.admin_adminnested_master' to type 'BaseMasterPage'."

Bu hatayı düzeltireceğiz, AdminNested.master arka plan kod sınıfı BaseMasterPagegenişletmemiz gerekir.To fix this we need to have the AdminNested.master code-behind class extend BaseMasterPage. İç içe yerleştirilmiş ana sayfanın arka plan kod sınıfı bildirimini şuradan güncelleştirin:Update the nested master page's code-behind class declaration from:

Partial Class Admin_AdminNested 
 Inherits System.Web.UI.MasterPage

Hedef:To:

Partial Class Admin_AdminNested 
 Inherits BaseMasterPage

Henüz bitmedi.We're not done yet. MustOverrideolarak işaretlenmiş üyeleri geçersiz kıldık, yani RefreshRecentProductsGrid ve GridMessageText.We need to override the members marked as MustOverride, namely RefreshRecentProductsGrid and GridMessageText. Bu Üyeler kullanıcı arabirimlerini güncelleştirmek için üst düzey ana sayfalar tarafından kullanılır.These members are used by the top-level master pages to update their user interfaces. (Aslında yalnızca Site.master ana sayfası bu yöntemleri kullanır, ancak her iki üst düzey ana sayfa da BaseMasterPagegenişlediğinden bu yöntemleri uygular.)(Actually, only the Site.master master page uses these methods, although both top-level master pages implement these methods, since both extend BaseMasterPage.)

Bu üyeleri AdminNested.masteruygulamamız gerekir, ancak tüm bu uygulamalar, iç içe yerleştirilmiş ana sayfa tarafından kullanılan en üst düzey ana sayfada yalnızca aynı üyeyi çağırmalıdır.While we need to implement these members in AdminNested.master, all these implementations need to do is simply call the same member in the top-level master page used by the nested master page. Örneğin, yönetim bölümündeki bir içerik sayfası, iç içe yerleştirilmiş ana sayfanın RefreshRecentProductsGrid yöntemini çağırdığında, iç içe geçmiş ana sayfanın tek yapması gerekir, sırasıyla Site.master veya Alternate.master``RefreshRecentProductsGrid yöntemini çağırır.For instance, when a content page in the Administration section calls the nested master page's RefreshRecentProductsGrid method, all the nested master page needs to do is, in turn, call Site.master or Alternate.master's RefreshRecentProductsGrid method.

Bunu başarmak için, AdminNested.masteren üstüne aşağıdaki @MasterType yönergesini ekleyerek başlayın:To achieve this, start by adding the following @MasterType directive to the top of AdminNested.master:

<%@ MasterType TypeName="BaseMasterPage" %>

@MasterType yönergesinin, Masteradlı arka plan kod sınıfına kesin olarak yazılmış bir özellik ekleyeceğini hatırlayın.Recall that the @MasterType directive adds a strongly-typed property to the code-behind class named Master. Sonra RefreshRecentProductsGrid ve GridMessageText üyelerini geçersiz kılın ve çağrıyı Masterkarşılık gelen yönteme devretmek yeterlidir:Then override the RefreshRecentProductsGrid and GridMessageText members and simply delegate the call to the Master's corresponding method:

Partial Class Admin_AdminNested 
 Inherits BaseMasterPage 
 Public Overrides Property GridMessageText() As String 
 Get 
 Return Master.GridMessageText 
 End Get 
 Set(ByVal value As String) 
 Master.GridMessageText = value 
 End Set 
 End Property 
 Public Overrides Sub RefreshRecentProductsGrid()
 Master.RefreshRecentProductsGrid()
 End Sub 
End Class

Bu kodla birlikte, yönetim bölümündeki içerik sayfalarını ziyaret edebilir ve kullanabilirsiniz.With this code in place, you should be able to visit and use the content pages in the Administration section. Şekil 12 ' de bir tarayıcıdan görüntülendiklerinde ~/Admin/Products.aspx sayfası gösterilmektedir.Figure 12 shows the ~/Admin/Products.aspx page when viewed through a browser. Gördüğünüz gibi sayfa, iç içe ana sayfada tanımlanan yönetim yönergeleri kutusunu içerir.As you can see, the page includes the Administration Instructions box, which is defined in the nested master page.

Yönetim bölümündeki Içerik sayfalarını her sayfanın üst kısmındaki yönergeleri IçerirThe Content Pages in the Administration Section Include Instructions at the Top of Each Page

Şekil 12: yönetim bölümündeki içerik sayfaları, her sayfanın üst kısmındaki yönergeleri içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 12: The Content Pages in the Administration Section Include Instructions at the Top of Each Page (Click to view full-size image)

7. Adım: çalışma zamanında uygun en üst düzey ana sayfayı kullanmaStep 7: Using the Appropriate Top-Level Master Page at Runtime

Yönetim bölümündeki tüm içerik sayfaları tamamen işlevsel olsa da, hepsi aynı üst düzey ana sayfayı kullanır ve ChooseMasterPage.aspxüzerinde kullanıcı tarafından seçilen ana sayfayı yoksayar.While all the content pages in the Administration section are fully functional, they all use the same top-level master page and ignore the master page selected by the user at ChooseMasterPage.aspx. Bu davranış, iç içe yerleştirilmiş ana sayfanın MasterPageFile özelliği statik olarak <%@ Master %> yönergesinde Site.master olarak ayarlanmış olması nedeniyle olur.This behavior is due to the fact that the nested master page has its MasterPageFile property statically set to Site.master in its <%@ Master %> directive.

Son Kullanıcı tarafından seçilen en üst düzey ana sayfayı kullanmak için, AdminNested.master``MasterPageFile özelliğini MyMasterPage oturum değişkenindeki değere ayarlamanız gerekir.To use the top-level master page selected by the end user we need to set the AdminNested.master's MasterPageFile property to the value in the MyMasterPage Session variable. BasePage' MasterPageFile içerik sayfalarının özelliklerini ayarlamamız nedeniyle, iç içe yerleştirilmiş ana sayfanın MasterPageFile özelliğini BaseMasterPage veya AdminNested.masterarka plan kod sınıfında ayarlayabileceğimizi düşünebilirsiniz.Because we set the content pages' MasterPageFile properties in BasePage, you may think that we would set the nested master page's MasterPageFile property in BaseMasterPage or in the AdminNested.master's code-behind class. Ancak, MasterPageFile özelliğini PreInit aşamasının sonuna kadar ayarlamış olmaları gerektiğinden, bu çalışmaz.This won't work, however, because we need to have set the MasterPageFile property by the end of the PreInit stage. Ana sayfadan sayfa yaşam döngüsüne programlı bir şekilde dokunduğumuz en kısa süre, Init aşamasıdır (ön Init aşamasından sonra gerçekleşir).The earliest time that we can programmatically tap into the page lifecycle from a master page is the Init stage (which occurs after the PreInit stage).

Bu nedenle, iç içe yerleştirilmiş ana sayfanın MasterPageFile özelliğini içerik sayfalarından ayarlamanız gerekir.Therefore, we need to set the nested master page's MasterPageFile property from the content pages. AdminNested.master ana sayfasını kullanan tek içerik sayfaları AdminBasePagetüretilir.The only content pages that use the AdminNested.master master page derive from AdminBasePage. Bu nedenle bu mantığı buraya koyabiliriz.Therefore, we can put this logic there. 5. adımda, sayfa nesnesinin MasterPageFile özelliğini "~/Admin/AdminNested.master" olarak ayarlayarak SetMasterPageFile yöntemi de çok fazla.In Step 5 we overrode the SetMasterPageFile method, setting the Page object's MasterPageFile property to "~/Admin/AdminNested.master". SetMasterPageFile, ana sayfanın MasterPageFile özelliğini oturum içinde depolanan sonuca ayarlamak için de güncelleştirin:Update SetMasterPageFile to also set the master page's MasterPageFile property to the result stored in Session:

Public Class AdminBasePage 
 Inherits BasePage 
 Protected Overrides Sub SetMasterPageFile() 
 Me.MasterPageFile = "~/Admin/AdminNested.master" 
 Page.Master.MasterPageFile = MyBase.GetMasterPageFileFromSession() 
 End Sub 
End Class

Önceki öğreticideki BasePage sınıfına eklediğimiz GetMasterPageFileFromSession yöntemi, oturum değişkeni değerine göre uygun ana sayfa dosya yolunu döndürür.The GetMasterPageFileFromSession method, which we added to the BasePage class in the preceding tutorial, returns the appropriate master page file path based on the Session variable value.

Bu değişiklik söz konusu olduğunda, kullanıcının ana sayfa seçimi yönetim bölümünün üzerinde geçiş yapar.With this change in place, the user's master page selection carries over to the Administration section. Şekil 13, Şekil 12 ile aynı sayfayı gösterir, ancak Kullanıcı Ana sayfa seçimini Alternate.masterolarak değiştirdikten sonra.Figure 13 shows the same page as Figure 12, but after the user has changed their master page selection to Alternate.master.

Iç Içe geçmiş Yönetim sayfasında Kullanıcı tarafından seçilen en üst düzey ana sayfayı kullanan The Nested Administration Page Uses the Top-Level Master Page Selected by the User

Şekil 13: Iç Içe yönetim sayfası, Kullanıcı tarafından seçilen en üst düzey ana sayfayı kullanır (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 13: The Nested Administration Page Uses the Top-Level Master Page Selected by the User (Click to view full-size image)

ÖzetSummary

İçerik sayfalarının ana sayfaya nasıl bağlanılmasından çok benzer şekilde, bir üst ana sayfaya bağlı bir alt ana sayfa oluşturarak iç içe yerleştirilmiş ana sayfalar oluşturmak mümkündür.Much like how content pages can bind to a master page, it is possible to create nested master pages by having a child master page bind to a parent master page. Alt ana sayfa, üst öğesinin Contenttutucuların her biri için Içerik denetimleri tanımlayabilir; daha sonra bu Içerik denetimlerine kendi ContentPlaceHolder denetimlerini (Ayrıca diğer biçimlendirmeleri de) ekleyebilirler.The child master page may define Content controls for each of its parent's ContentPlaceHolders; it can then add its own ContentPlaceHolder controls (as well as other markup) to these Content controls. İç içe yerleştirilmiş ana sayfalar, tüm sayfaların çok sayıda görünümü paylaştığı, ancak sitenin belirli bölümlerinin benzersiz özelleştirmeler gerektirmesine neden olan büyük Web uygulamalarında oldukça kullanışlıdır.Nested master pages are quite useful in large web applications where all pages share an overarching look and feel, yet certain sections of the site require unique customizations.

Programlamanın kutlu olsun!Happy Programming!

Daha Fazla BilgiFurther Reading

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:For more information on the topics discussed in this tutorial, refer to the following resources:

Yazar hakkındaAbout the Author

Birden çok ASP/ASP. NET Books ve 4GuysFromRolla.com 'in yazarı Scott Mitchell, 1998 sürümünden bu yana Microsoft Web teknolojileriyle birlikte çalışıyor.Scott Mitchell, author of multiple ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 3,5 kendi kendinize eğitimister.His latest book is Sams Teach Yourself ASP.NET 3.5 in 24 Hours. Scott 'a mitchell@4GuysFromRolla.com veya blogundan http://ScottOnWriting.NETüzerinden erişilebilir.Scott can be reached at mitchell@4GuysFromRolla.com or via his blog at http://ScottOnWriting.NET.

Özel olarak teşekkürlerSpecial Thanks To

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, beni mitchell@4GuysFromRolla.com bir satır bırakınIf so, drop me a line at mitchell@4GuysFromRolla.com