Tujuan:
Sadarilah penggunaan file .cs di MasterPage untuk menggantikan PageBase di proyek.
motivasi:
Motivasi penulisan artikel ini berasal dari proyek rekonstruksi. Dalam proyek arsitektur B/S .Net Framwork 2.0, teknologi PageBase dan MasterPage digunakan. Ditemukan bahwa setiap kali halaman diakses, halaman tersebut mengakses PageBase dan MasterPage secara bersamaan, yang tidak hanya menyebabkan penurunan kinerja, tetapi juga menyebabkan penurunan kinerja. tetapi bahkan dapat menyebabkan masalah dalam perluasan dan penyesuaian fungsi proyek di masa depan.
Aspek teknis:
PageBase: Teknologi yang sering digunakan di .Net Framework 1.1 untuk merangkum fungsionalitas yang sama dari beberapa halaman. Kelas PageBase.cs mewarisi dari kelas System.Web.UI.Page. Halaman Web dalam proyek mewarisi dari kelas PageBase.cs. Dengan mengganti metode inisialisasi halaman di kelas dasar, fungsi bisnis di PageBase dipanggil, seperti: parameter url. Verifikasi, penyimpanan kunjungan, dan fungsi lainnya (untuk metode implementasi spesifik, silakan lihat contoh resmi Microsoft duwamishi).
MasterPage: Fitur baru di .Net Framework 2.0. Secara fisik mencakup dua file: file .Master (markup html) dan file .cs (kode C#). File .Master mengimplementasikan gambar lapisan tampilan, dan file .cs mengimplementasikan fungsi tertentu. Halaman web yang mewarisi dari MasterPage dapat mewarisi konten lapisan tampilan di MasterPage. Untuk menggambar header dan footer umum serta menyesuaikan tata letak terpadu, MasterPage adalah pilihan yang baik.
Persyaratan simulasi:
Gunakan teknologi MasterPage untuk menggantikan PageBase guna menerapkan verifikasi parameter bilah alamat.
Mari kita beri penjelasan sederhana. Informasi tabel Login pada database adalah sebagai berikut:
Setelah login ke sistem, terdapat parameter pada address bar url, sebagai berikut:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Saat ini, pengguna secara manual mengubah parameter di bilah alamat URL sebagai:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
Ini dianggap sebagai operasi ilegal dan sistem akan secara otomatis kembali ke halaman login.
Iterasi kode pertama:
1. Lihat metode PageBase tradisional:
Pendekatan Halaman tradisional adalah:
kelas publik PageBase : System.Web.UI.Page
{
publikPageBase()
{
}
/**//// <ringkasan>
/// Metode masuk
/// </ringkasan>
dilindungi kekosongan Inisialisasi()
{
//Masukkan logika bisnis umum
}
}
Halaman web:
TestPage kelas parsial publik : PageBase
{
//Metode tradisional untuk memanggil PageBase
/**///// <ringkasan>
/// Ganti metode kelas dasar OnPreInit() dan panggil metode verifikasi umum
/// </ringkasan>
/// <param nama="e"></param>
override yang dilindungi batalkan OnInit(eventargs e)
{
dasar.Inisialisasi();
}
}
Ikuti pendekatan ini dan pindahkan kode di PageBase ke MasterPage:
MasterPage.cs:
kelas parsial publik MyMasterPage : System.Web.UI.MasterPage
{
dilindungi kekosongan Page_Load (pengirim objek, EventArgs e)
{
jika (!IsPostBack)
{
//Metode verifikasi panggilan
Inisialisasi();
}
}
}
Ubah kode di halaman web menjadi:
TestPage kelas parsial publik : System.Web.UI.Page
{
// Tiru metode PageBase dan panggil metode tersebut di Master
/**//// <ringkasan>
/// Ganti metode kelas dasar OnPreInit() dan panggil metode verifikasi umum
/// </ringkasan>
/// <param nama="e"></param>
override yang dilindungi batalkan OnInit(eventargs e)
{
// Dapatkan referensi halaman master
MyMasterPage myMasterPage = (MyMasterPage)ini.Master;
//Panggil metode verifikasi umum di halaman master
jika (!IsPostBack)
{
myMasterPage.Inisialisasi();
}
}
}Ganti metode Initialize() di MasterPage dengan yang ada di instance, uji kode:
Langkah 1: Masuk ke sistem dengan nama pengguna zhangsan, dan login berhasil.
Halaman tersebut menunjukkan bahwa zhangsan dipersilakan untuk masuk.
Alamat url menunjukkan:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Langkah 2: Ubah bilah alamat url secara manual: sebagai berikut:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
Halaman tersebut tidak akan menampilkan login lisi selamat datang, tetapi akan melompat kembali ke halaman login.
Refleksi: Meskipun fungsinya telah diterapkan, masih ada beberapa link yang kurang memuaskan:
1. Metode yang dipanggil oleh subkelas di Master harus berupa metode publik;
2. Meskipun tidak perlu mengubah warisan halaman Web, Anda masih harus menyalin dan menempel secara mekanis dan mengganti metode OnInit() dari kelas dasar.
Untuk menghilangkan perasaan yang masih melekat ini, saya mulai:
Iterasi kode kedua:
Ubah kode di MasterPage.cs:
kelas parsial publik MyMasterPage : System.Web.UI.MasterPage
{
dilindungi kekosongan Page_Load (pengirim objek, EventArgs e)
{
jika (!IsPostBack)
{
//Metode verifikasi panggilan
PeriksaLogin();
}
}
/**//// <ringkasan>
/// Verifikasi apakah akses tersebut legal
/// </ringkasan>
kekosongan pribadi CheckLogin()
{
// Jika nomor di url atau nomor di cookie
if (string.IsNullOrEmpty(Permintaan.QueryString["id"])
||.string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Respon.Redirect("Login.aspx");
}//Jika nomor di url tidak sesuai dengan nomor di cookie, kembali ke halaman login
else if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Respon.Redirect("Login.aspx");
}
}
}Setelah rekonstruksi, halaman Web tidak dapat dimodifikasi dengan cara apa pun. MasterPage secara otomatis memanggil metode verifikasi dalam metode Page_Load() miliknya sendiri, dan menyetel metode verifikasi ke pribadi, yang hanya dapat dipanggil oleh MasterPage sendiri untuk meningkatkan keamanan. Pada titik ini, kodenya tampaknya ideal.
Langkah 1: Masuk ke sistem dengan nama pengguna zhangsan.
Halaman login pengguna masih ditampilkan.
Tes gagal.
Gunakan breakpoint untuk melacak kode dan temukan bahwa masalah terjadi pada cuplikan kode dalam metode CheckLogin() di MasterPage.cs:
if (string.IsNullOrEmpty(Permintaan.QueryString["id"])
||.string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Respon.Redirect("Login.aspx");
}
Karena halaman login mewarisi dari MasterPage, metode verifikasi di MasterPage.cs secara otomatis dipanggil saat halaman dimuat, dan parameternya sendiri tidak memenuhi metode string.IsNullOrEmpty(), sehingga melompat kembali ke halaman login halaman dimuat lagi. Metode verifikasi di kelas dasar dipanggil, sehingga membentuk loop tak terbatas.
Dalam teknologi PageBase, halaman Web dapat mewarisi secara selektif dari PageBase, tetapi dalam teknologi MasterPage, untuk mendapatkan efek lapisan tampilan yang konsisten, selektivitas halaman Web untuk mewarisi MasterPage sangat rendah, dan kita tidak boleh membuat tampilan yang sama dengan membuat yang baru. , MasterPage tanpa kode verifikasi digunakan untuk mewarisi halaman Web yang tidak perlu mewarisi fungsi kelas dasar. Untuk mengatasi masalah ini, iterasi ketiga dimulai:
Impor file konfigurasi:
<?xml versi="1.0" pengkodean="utf-8" ?>
<halaman>
<halaman pengujian>
<page title="TestPage" url="TestPage.aspx" needvalidate="true"/>
<page title="Login" url="Login.aspx" needvalidate="false"/>
</halaman pengujian>
<halaman admin>
<page title="Page1" url="~/Admin/Page1.aspx" needvalidate="false"/>
<page title="Page2" url="~/Admin/Page2.aspx" needvalidate="false"/>
</halaman admin>
</halaman>
Seperti yang Anda lihat, halaman yang perlu diverifikasi telah diidentifikasi (needvalidate="true").
Buat kelas akses data XML:
XmlDAL kelas publik
{
string statis pribadi filePath = string.Empty;
XmlDAL statis()
{
//Inisialisasi jalur file konfigurasi
filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml");
}
/**//// <ringkasan>
/// Dapatkan daftar halaman yang perlu diverifikasi
/// </ringkasan>
/// <returns>Daftar halaman yang memerlukan verifikasi</returns>
IList statis publik<string> GetValidatePages()
{
IList<string> halaman = Daftar baru<string>();
// Jika file konfigurasi yang ditentukan ada
jika (Sistem.IO.File.Ada(filePath))
{
mencoba
{
XmlDocument xmlDoc = XmlDocument baru();
xmlDoc.Muat(Jalur File);
// Dapatkan node root dari file konfigurasi
XmlNode root = xmlDoc.DocumentElement;
string xpath = "/halaman/halaman pengujian/halaman[@needvalidate='true']";
XmlNodeList nodeList = root.SelectNodes(xpath);
// Pengumpulan simpul kenyamanan
foreach (simpul XmlNode di nodeList)
{
halaman.Tambahkan(simpul.Atribut["judul"].Nilai);
}
}
menangkap (Pengecualian ex)
{
melempar Pengecualian baru (mis. Pesan);
}
}
halaman kembali;
}
}
Ubah kode di MasterPage.cs dan tambahkan metode IsValidateNeeded(string url) untuk mendeteksi apakah halaman saat ini memerlukan verifikasi.
kelas parsial publik MyMasterPage : System.Web.UI.MasterPage
{
dilindungi kekosongan Page_Load (pengirim objek, EventArgs e)
{
jika (!IsPostBack)
{
//Metode verifikasi panggilan
PeriksaLogin();
}
}
/**//// <ringkasan>
/// Verifikasi apakah akses tersebut legal
/// </ringkasan>
kekosongan pribadi CheckLogin()
{
// Tentukan apakah halaman yang sedang diakses memerlukan verifikasi
if (IsValidateNeeded(Request.RawUrl))
{
// Jika nomor di url atau nomor di cookie
if (string.IsNullOrEmpty(Permintaan.QueryString["id"])
||.string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Respon.Redirect("Login.aspx");
}//Jika nomor di url tidak sesuai dengan nomor di cookie, kembali ke halaman login
else if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Respon.Redirect("Login.aspx");
}
}
}
/**//// <ringkasan>
/// Verifikasi apakah halaman saat ini memerlukan verifikasi
/// </ringkasan>
/// <param name="currentPage">Nama halaman saat ini</param>
/// <returns>Apakah status perlu diverifikasi</returns>
bool pribadi IsValidateNeeded (string url)
{
bool diperlukan = false;
// Metode GetValidatePages() mengembalikan daftar halaman yang perlu diverifikasi
IList<string> halaman = XmlDAL.GetValidatePages();
IEnumerator<string> yaitu = halaman.GetEnumerator();
sementara (yaitu.MoveNext())
{
// Jika halaman saat ini memerlukan verifikasi
if (url.Contains(ie.Current))
//Kembali ke status yang memerlukan verifikasi
kembali diperlukan = benar;
}
pengembalian diperlukan;
}
}
Untuk menguji:
Langkah 1: Masuk ke sistem dengan nama pengguna zhangsan, dan login berhasil.
Halaman tersebut menunjukkan bahwa zhangsan dipersilakan untuk masuk.
Alamat url menunjukkan:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Langkah 2: Ubah bilah alamat url secara manual: sebagai berikut:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
Halaman tersebut tidak akan menampilkan login lisi selamat datang, tetapi akan melompat kembali ke halaman login.
Ini menyimpulkan iterasi kode saya.
Unduhan kode: