Bagikan melalui


Menentukan Halaman Master Secara Terprogram (C#)

oleh Scott Mitchell

Melihat pengaturan halaman master halaman konten secara terprogram melalui penanganan aktivitas PreInit.

Pendahuluan

Sejak contoh perdana dalam Membuat Tata Letak Seluruh Situs Menggunakan Halaman Master, semua halaman konten telah mereferensikan halaman master mereka secara deklaratif melalui MasterPageFile atribut dalam @Page direktif. Misalnya, arahan berikut menautkan @Page halaman konten ke halaman Site.mastermaster :

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

Kelas Page di System.Web.UI namespace menyertakan MasterPageFile properti yang mengembalikan jalur ke halaman master halaman konten; properti inilah yang diatur oleh direktif@Page. Properti ini juga dapat digunakan untuk menentukan halaman master halaman konten secara terprogram. Pendekatan ini berguna jika Anda ingin menetapkan halaman master secara dinamis berdasarkan faktor eksternal, seperti pengguna yang mengunjungi halaman.

Dalam tutorial ini kami menambahkan halaman master kedua ke situs web kami dan secara dinamis memutuskan halaman master mana yang akan digunakan pada runtime.

Langkah 1: Melihat Siklus Hidup Halaman

Setiap kali permintaan tiba di server web untuk halaman ASP.NET yang merupakan halaman konten, mesin ASP.NET harus menyatukan kontrol Konten halaman ke dalam kontrol ContentPlaceHolder halaman master yang sesuai. Fusi ini menciptakan hierarki kontrol tunggal yang kemudian dapat dilanjutkan melalui siklus hidup halaman yang khas.

Gambar 1 menggambarkan fusi ini. Langkah 1 di Gambar 1 memperlihatkan konten awal dan hierarki kontrol halaman master. Di akhir ekor tahap PreInit, kontrol Konten di halaman ditambahkan ke ContentPlaceHolders yang sesuai di halaman master (Langkah 2). Setelah fusi ini, halaman master berfungsi sebagai akar hierarki kontrol menyatu. Hierarki kontrol yang menyatu ini kemudian ditambahkan ke halaman untuk menghasilkan hierarki kontrol akhir (Langkah 3). Hasil bersih adalah bahwa hierarki kontrol halaman menyertakan hierarki kontrol yang menyatu.

Halaman Master dan Hierarki Kontrol Halaman Konten Menyatu Selama Tahap PreInit

Gambar 01: Halaman Master dan Hierarki Kontrol Halaman Konten Digabungkan Bersama-sama selama Tahap PreInit (Klik untuk melihat gambar ukuran penuh)

Langkah 2: MengaturMasterPageFileProperti dari Kode

Halaman master apa yang dipartisi dalam fusi ini tergantung pada nilai Page properti objek MasterPageFile . MasterPageFile Mengatur atribut dalam direktif @Page memiliki efek bersih untuk menetapkan Pageproperti selama MasterPageFile tahap Inisialisasi, yang merupakan tahap pertama siklus hidup halaman. Kita dapat mengatur properti ini secara terprogram. Namun, sangat penting bahwa properti ini diatur sebelum fusi di Gambar 1 terjadi.

Pada awal tahap Page PreInit, objek menaikkan peristiwanya PreInit dan memanggil metodenyaOnPreInit. Untuk mengatur halaman master secara terprogram, maka, kita dapat membuat penanganan aktivitas untuk peristiwa atau PreInit mengambil alih OnPreInit metode . Mari kita lihat kedua pendekatan tersebut.

Mulailah dengan membuka Default.aspx.cs, file kelas code-behind untuk beranda situs kami. Tambahkan penanganan aktivitas untuk peristiwa halaman PreInit dengan mengetikkan kode berikut:

protected void Page_PreInit(object sender, EventArgs e) 
{ 
}

Dari sini kita dapat mengatur MasterPageFile properti. Perbarui kode sehingga menetapkan nilai "~/Site.master" ke MasterPageFile properti .

protected void Page_PreInit(object sender, EventArgs e) 
{
    this.MasterPageFile = "~/Site.master"; 
}

Jika Anda mengatur titik henti dan mulai dengan penelusuran kesalahan, Anda akan melihat bahwa setiap kali Default.aspx halaman dikunjungi atau setiap kali ada postback ke halaman ini, Page_PreInit penanganan aktivitas dijalankan dan MasterPageFile properti ditetapkan ke "~/Site.master".

Atau, Anda dapat mengambil alih Page metode kelas OnPreInit dan mengatur properti di MasterPageFile sana. Untuk contoh ini, jangan atur halaman master di halaman tertentu, melainkan dari BasePage. Ingat bahwa kita membuat kelas halaman dasar kustom (BasePage) kembali di tutorial Menentukan Judul, Tag Meta, dan Html Lainnya dalam tutorial Halaman Master. Saat ini BasePage mengambil Page alih metode kelas OnLoadComplete , di mana ia mengatur properti halaman Title berdasarkan data peta situs. Mari kita perbarui BasePage untuk juga mengambil OnPreInit alih metode untuk menentukan halaman master secara terprogram.

protected override void OnPreInit(EventArgs e) 
{ 
    this.MasterPageFile = "~/Site.master"; 
    base.OnPreInit(e); 
}

Karena semua halaman konten kami berasal dari BasePage, semuanya sekarang memiliki halaman master mereka yang ditetapkan secara terprogram. Pada titik ini penanganan PreInit aktivitas di Default.aspx.cs berlebihan; jangan ragu untuk menghapusnya.

Bagaimana dengan Direktif@Page?

Yang mungkin sedikit membingungkan adalah bahwa properti halaman MasterPageFile konten sekarang ditentukan di dua tempat: secara terprogram dalam BasePage metode kelas OnPreInit serta melalui MasterPageFile atribut di setiap arahan halaman @Page konten.

Tahap pertama dalam siklus hidup halaman adalah tahap Inisialisasi. Selama tahap Page ini, properti objek MasterPageFile diberi nilai MasterPageFile atribut dalam direktif @Page (jika disediakan). Tahap PreInit mengikuti tahap Inisialisasi, dan di sinilah kami secara terprogram mengatur Page properti objek MasterPageFile , sehingga menimpa nilai yang ditetapkan dari @Page arahan. Karena kami mengatur Page properti objek MasterPageFile secara terprogram, kami dapat menghapus MasterPageFile atribut dari @Page arahan tanpa memengaruhi pengalaman pengguna akhir. Untuk meyakinkan diri Anda tentang hal ini, lanjutkan dan hapus MasterPageFile atribut dari @Page arahan di Default.aspx dan kemudian kunjungi halaman melalui browser. Seperti yang Anda harapkan, outputnya sama seperti sebelum atribut dihapus.

MasterPageFile Apakah properti diatur melalui direktif @Page atau secara terprogram tidak sesuai dengan pengalaman pengguna akhir. Namun, MasterPageFile atribut dalam arahan @Page digunakan oleh Visual Studio selama waktu desain untuk menghasilkan tampilan WYSIWYG di Perancang. Jika Anda kembali ke Default.aspx Visual Studio dan menavigasi ke Perancang, Anda akan melihat pesan, "Kesalahan Halaman Master: Halaman memiliki kontrol yang memerlukan referensi Halaman Master, tetapi tidak ada yang ditentukan" (lihat Gambar 2).

Singkatnya MasterPageFile , Anda perlu meninggalkan atribut dalam direktif @Page untuk menikmati pengalaman waktu desain yang kaya di Visual Studio.

Visual Studio Menggunakan kelas <span= Atribut MasterPageFile @Page Directive untuk Merender Tampilan Desain" />

Gambar 02: Visual Studio Menggunakan @Page Atribut Direktif MasterPageFile untuk Merender Tampilan Desain (Klik untuk melihat gambar ukuran penuh)

Langkah 3: Membuat Halaman Master Alternatif

Karena halaman master halaman konten dapat diatur secara terprogram pada runtime dimungkinkan untuk memuat halaman master tertentu secara dinamis berdasarkan beberapa kriteria eksternal. Fungsionalitas ini dapat berguna dalam situasi di mana tata letak situs perlu bervariasi berdasarkan pengguna. Misalnya, aplikasi web mesin blog dapat memungkinkan penggunanya memilih tata letak untuk blog mereka, di mana setiap tata letak dikaitkan dengan halaman master yang berbeda. Pada runtime, ketika pengunjung melihat blog pengguna, aplikasi web perlu menentukan tata letak blog dan secara dinamis mengaitkan halaman master yang sesuai dengan halaman konten.

Mari kita periksa cara memuat halaman master secara dinamis pada runtime berdasarkan beberapa kriteria eksternal. Situs web kami saat ini hanya berisi satu halaman master (Site.master). Kita memerlukan halaman master lain untuk mengilustrasikan memilih halaman master saat runtime. Langkah ini berfokus pada pembuatan dan konfigurasi halaman master baru. Langkah 4 melihat menentukan halaman master apa yang akan digunakan saat runtime.

Buat halaman master baru di folder akar bernama Alternate.master. Tambahkan juga lembar gaya baru ke situs web bernama AlternateStyles.css.

Tambahkan Halaman Master lain dan File CSS ke Situs Web

Gambar 03: Tambahkan Halaman Master lain dan File CSS ke Situs Web (Klik untuk melihat gambar ukuran penuh)

Saya telah merancang Alternate.master halaman master agar judul ditampilkan di bagian atas halaman, di tengah dan di latar belakang angkatan laut. Saya telah mengeluarkan kolom kiri dan memindahkan konten tersebut MainContent di bawah kontrol ContentPlaceHolder, yang sekarang mencakup seluruh lebar halaman. Selain itu, saya men-nix daftar Pelajaran yang tidak diurutkan dan menggantinya dengan daftar horizontal di atas MainContent. Saya juga memperbarui font dan warna yang digunakan oleh halaman master (dan, berdasarkan ekstensi, halaman kontennya). Gambar 4 memperlihatkan Default.aspx saat menggunakan Alternate.master halaman master.

Catatan

ASP.NET mencakup kemampuan untuk menentukan Tema. Tema adalah kumpulan gambar, file CSS, dan pengaturan properti kontrol Web terkait gaya yang dapat diterapkan ke halaman pada runtime. Tema adalah cara untuk pergi jika tata letak situs Anda hanya berbeda dalam gambar yang ditampilkan dan oleh aturan CSS mereka. Jika tata letak berbeda lebih substansial, seperti menggunakan kontrol Web yang berbeda atau memiliki tata letak yang berbeda secara radikal, maka Anda harus menggunakan halaman master terpisah. Lihat bagian Bacaan Lebih Lanjut di akhir tutorial ini untuk informasi selengkapnya tentang Tema.

Halaman Konten Kami Sekarang Dapat Menggunakan Tampilan dan Nuansa Baru

Gambar 04: Halaman Konten Kami Sekarang Dapat Menggunakan Tampilan dan Nuansa Baru (Klik untuk melihat gambar ukuran penuh)

Saat markup halaman master dan konten menyatu, MasterPage kelas memeriksa untuk memastikan bahwa setiap kontrol Konten di halaman konten mereferensikan ContentPlaceHolder di halaman master. Pengecualian dilemparkan jika kontrol Konten yang mereferensikan ContentPlaceHolder yang tidak ada ditemukan. Dengan kata lain, sangat penting bahwa halaman master yang ditetapkan ke halaman konten memiliki ContentPlaceHolder untuk setiap kontrol Konten di halaman konten.

Halaman Site.master master menyertakan empat kontrol ContentPlaceHolder:

  • head
  • MainContent
  • QuickLoginUI
  • LeftColumnContent

Beberapa halaman konten di situs web kami hanya mencakup satu atau dua kontrol Konten; lainnya menyertakan kontrol Konten untuk setiap ContentPlaceHolders yang tersedia. Jika halaman master baru kami (Alternate.master) mungkin pernah ditetapkan ke halaman konten yang memiliki kontrol Konten untuk semua ContentPlaceHolders di Site.master maka sangat penting yang Alternate.master juga menyertakan kontrol ContentPlaceHolder yang sama dengan Site.master.

Untuk membuat halaman master Anda Alternate.master terlihat mirip dengan tambang (lihat Gambar 4), mulailah dengan menentukan gaya halaman master dalam AlternateStyles.css lembar gaya. Tambahkan aturan berikut ke dalam AlternateStyles.css:

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; 
}

Selanjutnya, tambahkan markup deklaratif berikut ke Alternate.master. Seperti yang Anda lihat, Alternate.master berisi empat kontrol ContentPlaceHolder dengan nilai yang sama ID dengan kontrol ContentPlaceHolder di Site.master. Selain itu, ini termasuk kontrol ScriptManager, yang diperlukan untuk halaman-halaman tersebut di situs web kami yang menggunakan kerangka kerja AJAX ASP.NET.

<!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>

Menguji Halaman Master Baru

Untuk menguji halaman master baru ini, perbarui BasePage metode kelas OnPreInit sehingga MasterPageFile properti diberi nilai "~/Alternate.master" lalu kunjungi situs web. Setiap halaman harus berfungsi tanpa kesalahan kecuali untuk dua: ~/Admin/AddProduct.aspx dan ~/Admin/Products.aspx. Menambahkan produk ke DetailsView menghasilkan ~/Admin/AddProduct.aspx NullReferenceException dari baris kode yang mencoba mengatur properti halaman GridMessageText master. Saat mengunjungi ~/Admin/Products.aspx dimuat InvalidCastException di halaman dengan pesan: "Tidak dapat melemparkan objek jenis 'ASP.alternate_master' untuk mengetik 'ASP.site_master'."

Kesalahan ini terjadi karena Site.master kelas code-behind mencakup peristiwa publik, properti, dan metode yang tidak ditentukan dalam Alternate.master. Bagian markup dari kedua halaman ini memiliki @MasterType arahan yang mereferensikan Site.master halaman master.

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

Selain itu, penanganan aktivitas DetailsView ItemInserted menyertakan ~/Admin/AddProduct.aspx kode yang mentransmisikan properti yang diketik Page.Master secara longgar ke objek jenis Site. Direktif @MasterType (digunakan dengan cara ini) dan pemeran ItemInserted dalam penanganan aktivitas dengan erat menggabungkan ~/Admin/AddProduct.aspx halaman dan ~/Admin/Products.aspx ke Site.master halaman master.

Untuk memutuskan konektor ketat ini, kita dapat memiliki Site.master dan Alternate.master berasal dari kelas dasar umum yang berisi definisi untuk anggota publik. Setelah itu, kita dapat memperbarui arahan untuk mereferensikan @MasterType jenis dasar umum ini.

Membuat Kelas Halaman Master Dasar Kustom

Tambahkan file kelas baru ke App_Code folder bernama BaseMasterPage.cs dan dapatkan dari System.Web.UI.MasterPage. Kita perlu menentukan RefreshRecentProductsGrid metode dan GridMessageText properti di BaseMasterPage, tetapi kita tidak bisa memindahkannya ke sana karena Site.master anggota ini bekerja dengan kontrol Web yang khusus untuk Site.master halaman master ( RecentProducts GridView dan GridMessage Label).

Apa yang perlu kita lakukan adalah mengonfigurasi BaseMasterPage sedemikian sehingga anggota ini didefinisikan di sana, tetapi sebenarnya diimplementasikan oleh BaseMasterPagekelas turunan (Site.master dan Alternate.master). Jenis warisan ini dimungkinkan dengan menandai kelas dan anggotanya sebagai abstract. Singkatnya, menambahkan abstract kata kunci ke kedua anggota ini mengumumkan yang BaseMasterPage belum diimplementasikan RefreshRecentProductsGrid dan GridMessageText, tetapi kelas turunannya akan.

Kita juga perlu mendefinisikan PricesDoubled peristiwa di BaseMasterPage dan menyediakan sarana dengan kelas turunan untuk meningkatkan acara. Pola yang digunakan dalam .NET Framework untuk memfasilitasi perilaku ini adalah membuat peristiwa publik di kelas dasar dan menambahkan metode yang dilindungi bernama virtual OnEventName. Kelas turunan kemudian dapat memanggil metode ini untuk menaikkan peristiwa atau dapat mengambil alihnya untuk segera menjalankan kode sebelum atau setelah peristiwa dinaikkan.

Perbarui kelas Anda BaseMasterPage sehingga berisi kode berikut:

using System; public abstract class BaseMasterPage : System.Web.UI.MasterPage
{ 
    public event EventHandler PricesDoubled; 
    protected virtual void OnPricesDoubled(EventArgs e) 
    { 
        if (PricesDoubled != null) 
        PricesDoubled(this, e); 
    } 
    public abstract void RefreshRecentProductsGrid();
    public abstract string GridMessageText 
    { 
        get; 
        set; 
    } 
}

Selanjutnya, buka Site.master kelas code-behind dan dapatkan dari BaseMasterPage. Karena BaseMasterPage apakah abstract kita perlu mengambil alih anggota-anggota di abstract sini di Site.master. override Tambahkan kata kunci ke definisi metode dan properti. Perbarui juga kode yang menaikkan PricesDoubled peristiwa di DoublePrice penanganan aktivitas Tombol Click dengan panggilan ke metode kelas OnPricesDoubled dasar.

Setelah modifikasi Site.master ini, kelas code-behind harus berisi kode berikut:

public partial class Site : BaseMasterPage { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
        DateDisplay.Text = DateTime.Now.ToString("dddd, MMMM dd"); 
    } 
    public override void RefreshRecentProductsGrid()
    { 
        RecentProducts.DataBind();
    } 
    public override string GridMessageText
    { 
        get 
        {
            return GridMessage.Text;
        } 
        set
        {
            GridMessage.Text = value; 
        } 
    }
    protected void DoublePrice_Click(object sender, EventArgs e) 
    { 
        // Double the prices 
        DoublePricesDataSource.Update();
        // Refresh RecentProducts 
        RecentProducts.DataBind();
        // Raise the PricesDoubled event
        base.OnPricesDoubled(EventArgs.Empty);
    } 
}

Kita juga perlu memperbarui Alternate.masterkelas code-behind untuk berasal dari BaseMasterPage dan mengambil alih kedua abstract anggota. Tetapi karena Alternate.master tidak berisi GridView yang mencantumkan produk terbaru atau Label yang menampilkan pesan setelah produk baru ditambahkan ke database, metode ini tidak perlu melakukan apa pun.

public partial class Alternate : BaseMasterPage 
{ 
    public override void RefreshRecentProductsGrid() 
    { 
        // Do nothing 
    } 
    public override string GridMessageText 
    { 
        get
        { 
            return string.Empty;
        } 
        set
        {
            // Do nothing 
        } 
    }
}

Mereferensikan Kelas Halaman Master Dasar

Sekarang setelah kami menyelesaikan BaseMasterPage kelas dan memiliki dua halaman master kami yang memperluasnya, langkah terakhir kami adalah memperbarui ~/Admin/AddProduct.aspx halaman dan ~/Admin/Products.aspx untuk merujuk ke jenis umum ini. Mulailah dengan mengubah arahan @MasterType di kedua halaman dari:

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

Kepada:

<%@ MasterType TypeName="BaseMasterPage" %>

Daripada mereferensikan jalur file, @MasterType properti sekarang mereferensikan jenis dasar (BaseMasterPage). Akibatnya, properti yang di ketik Master dengan kuat yang digunakan di kedua kelas code-behind halaman sekarang berjenis BaseMasterPage (bukan jenis Site). Dengan perubahan ini di tempat mengunjungi ~/Admin/Products.aspxkembali . Sebelumnya, ini mengakibatkan kesalahan transmisi karena halaman dikonfigurasi untuk menggunakan Alternate.master halaman master, tetapi direktif @MasterType mereferensikan Site.master file. Tetapi sekarang halaman dirender tanpa kesalahan. Ini karena Alternate.master halaman master dapat ditransmisikan ke objek jenis BaseMasterPage (karena memperluasnya).

Ada satu perubahan kecil yang perlu dilakukan di ~/Admin/AddProduct.aspx. Penanganan aktivitas kontrol ItemInserted DetailsView menggunakan properti yang diketik Master dengan kuat dan properti yang diketik Page.Master secara longgar. Kami memperbaiki referensi yang sangat ditik ketika kami memperbarui @MasterType direktif, tetapi kami masih perlu memperbarui referensi yang ditik secara longgar. Ganti baris kode berikut:

Site myMasterPage = Page.Master as Site;

Dengan yang berikut ini, yang dilemparkan Page.Master ke jenis dasar:

BaseMasterPage myMasterPage = Page.Master as BaseMasterPage;

Langkah 4: Menentukan Halaman Master Apa yang Akan Diikat ke Halaman Konten

Kelas kami BasePage saat ini menetapkan semua properti halaman MasterPageFile konten ke nilai yang dikodekan secara permanen dalam tahap PreInit dari siklus hidup halaman. Kita dapat memperbarui kode ini untuk mendasarkan halaman master pada beberapa faktor eksternal. Mungkin halaman master yang akan dimuat tergantung pada preferensi pengguna yang saat ini masuk. Dalam hal ini, kita perlu menulis kode dalam OnPreInit metode dalam BasePage yang mencari preferensi halaman master pengguna yang saat ini mengunjungi.

Mari kita buat halaman web yang memungkinkan pengguna memilih halaman master mana yang akan digunakan - Site.master atau Alternate.master - dan menyimpan pilihan ini dalam variabel Sesi. Mulailah dengan membuat halaman web baru di direktori akar bernama ChooseMasterPage.aspx. Saat membuat halaman ini (atau halaman konten lain selanjutnya) Anda tidak perlu mengikatnya ke halaman master karena halaman master diatur secara terprogram di BasePage. Namun, jika Anda tidak mengikat halaman baru ke halaman master, markup deklaratif default halaman baru berisi Formulir Web dan konten lain yang disediakan oleh halaman master. Anda harus mengganti markup ini secara manual dengan kontrol Konten yang sesuai. Untuk alasan itu, saya merasa lebih mudah untuk mengikat halaman ASP.NET baru ke halaman master.

Catatan

Karena Site.master dan Alternate.master memiliki kumpulan kontrol ContentPlaceHolder yang sama, tidak masalah halaman master apa yang Anda pilih saat membuat halaman konten baru. Untuk konsistensi, saya sarankan menggunakan Site.master.

Tambahkan Halaman Isi Baru ke Situs Web

Gambar 05: Tambahkan Halaman Konten Baru ke Situs Web (Klik untuk melihat gambar ukuran penuh)

Web.sitemap Perbarui file untuk menyertakan entri untuk pelajaran ini. Tambahkan markup berikut di bawah <siteMapNode> untuk Halaman Master dan pelajaran AJAX ASP.NET:

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

Sebelum menambahkan konten apa pun ke ChooseMasterPage.aspx halaman, luangkan waktu sejenak untuk memperbarui kelas code-behind halaman sehingga berasal dari BasePage (bukan System.Web.UI.Page). Selanjutnya, tambahkan kontrol DropDownList ke halaman, atur propertinya ID ke MasterPageChoice, dan tambahkan dua ListItem dengan Text nilai "~/Site.master" dan "~/Alternate.master".

Tambahkan kontrol Web Tombol ke halaman dan atur ID properti dan Text ke SaveLayout dan "Simpan Pilihan Tata Letak", masing-masing. Pada titik ini markup deklaratif halaman Anda akan terlihat mirip dengan yang berikut ini:

<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>

Ketika halaman pertama kali dikunjungi, kita perlu menampilkan pilihan halaman master yang saat ini dipilih pengguna. Buat Page_Load penanganan aktivitas dan tambahkan kode berikut:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
        if (Session["MyMasterPage"] != null)
        {
            ListItem li = MasterPageChoice.Items.FindByText(Session["MyMasterPage"].ToString());
            if (li != null) 
                li.Selected = true; 
        } 
    }
}

Kode di atas hanya dijalankan pada kunjungan halaman pertama (dan bukan pada postback berikutnya). Pertama-tama memeriksa apakah variabel MyMasterPage Sesi ada. Jika ya, ia mencoba menemukan ListItem yang cocok di MasterPageChoice DropDownList. Jika ListItem yang cocok ditemukan, propertinya Selected diatur ke true.

Kita juga memerlukan kode yang menyimpan pilihan pengguna ke dalam MyMasterPage variabel Sesi. Buat penanganan aktivitas untuk SaveLayout peristiwa Tombol Click dan tambahkan kode berikut:

protected void SaveLayout_Click(object sender, EventArgs e)
{
    Session["MyMasterPage"] = MasterPageChoice.SelectedValue;
    Response.Redirect("ChooseMasterPage.aspx"); 
}

Catatan

Pada saat Click penanganan aktivitas dijalankan pada postback, halaman master telah dipilih. Oleh karena itu, pilihan daftar drop-down pengguna tidak akan berlaku hingga kunjungan halaman berikutnya. Memaksa Response.Redirect browser untuk meminta ChooseMasterPage.aspxkembali .

ChooseMasterPage.aspx Dengan halaman selesai, tugas akhir kami adalah menetapkan BasePage MasterPageFile properti berdasarkan nilai MyMasterPage variabel Sesi. Jika variabel Sesi tidak diatur memiliki BasePage default ke Site.master.

protected override void OnPreInit(EventArgs e) 
{ 
    SetMasterPageFile();
    base.OnPreInit(e); 
} 
protected virtual void SetMasterPageFile()
{ 
    this.MasterPageFile = GetMasterPageFileFromSession();
} 
protected string GetMasterPageFileFromSession() 
{ 
    if (Session["MyMasterPage"] == null) 
        return "~/Site.master";
    else
        return Session["MyMasterPage"].ToString(); 
}

Catatan

Saya memindahkan kode yang menetapkan Page properti objek MasterPageFile dari OnPreInit penanganan aktivitas dan ke dalam dua metode terpisah. Metode pertama ini, SetMasterPageFile, menetapkan MasterPageFile properti ke nilai yang dikembalikan oleh metode kedua, GetMasterPageFileFromSession. Saya membuat SetMasterPageFile metode virtual sehingga kelas di masa mendatang yang diperluas BasePage dapat secara opsional mengambil alihnya untuk menerapkan logika kustom, jika diperlukan. Kita akan melihat contoh properti penggantian BasePageSetMasterPageFile di tutorial berikutnya.

Dengan kode ini di tempat, kunjungi ChooseMasterPage.aspx halaman. Awalnya, Site.master halaman master dipilih (lihat Gambar 6), tetapi pengguna dapat memilih halaman master yang berbeda dari daftar drop-down.

Halaman Isi Ditampilkan Menggunakan Halaman Master Site.master

Gambar 06: Halaman Konten Ditampilkan Menggunakan Site.master Halaman Master (Klik untuk melihat gambar ukuran penuh)

Halaman Konten Sekarang Ditampilkan Menggunakan Halaman Master Alternate.master

Gambar 07: Halaman Konten Sekarang Ditampilkan Menggunakan Alternate.master Halaman Master (Klik untuk melihat gambar ukuran penuh)

Ringkasan

Saat halaman konten dikunjungi, kontrol Kontennya menyatu dengan kontrol ContentPlaceHolder halaman masternya. Halaman master halaman konten ditandai oleh Page properti kelas MasterPageFile , yang ditetapkan ke @Page atribut direktif MasterPageFile selama tahap Inisialisasi. Seperti yang ditunjukkan tutorial ini, kita dapat menetapkan nilai ke MasterPageFile properti selama kita melakukannya sebelum akhir tahap PreInit. Mampu menentukan halaman master secara terprogram membuka pintu untuk skenario yang lebih canggih, seperti mengikat halaman konten secara dinamis ke halaman master berdasarkan faktor eksternal.

Selamat Pemrograman!

Bacaan lebih lanjut

Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:

Tentang Penulis

Scott Mitchell, penulis beberapa buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 3,5 dalam 24 Jam. Scott dapat dijangkau di mitchell@4GuysFromRolla.com atau melalui blognya di http://ScottOnWriting.NET.

Terima kasih khusus untuk

Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau prospek untuk tutorial ini adalah Suchi Banerjee. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, menjatuhkan saya baris di mitchell@4GuysFromRolla.com