Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.master
master :
<%@ 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.
Gambar 01: Halaman Master dan Hierarki Kontrol Halaman Konten Digabungkan Bersama-sama selama Tahap PreInit (Klik untuk melihat gambar ukuran penuh)
Langkah 2: MengaturMasterPageFile
Properti 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 Page
properti 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.
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
.
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.
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 BaseMasterPage
kelas 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.master
kelas 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.aspx
kembali . 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
.
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.aspx
kembali .
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 BasePage
SetMasterPageFile
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.
Gambar 06: Halaman Konten Ditampilkan Menggunakan Site.master
Halaman Master (Klik untuk melihat gambar ukuran penuh)
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:
- Gambaran Umum Siklus Hidup Halaman ASP.NET
- Gambaran Umum Tema dan Kulit ASP.NET
- Halaman Master: Tips, Trik, dan Perangkap
- Tema dalam ASP.NET
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