ASP.Net menyediakan skin tema, yang sebenarnya merupakan perubahan skin. Namun banyak orang di Internet yang mengatakan bahwa benda ini tidak ada gunanya, mengatakan bahwa benda ini dapat digunakan di halaman .aspx, tetapi tidak dapat digunakan di halaman master (MasterPage). Ya, memang benar Anda tidak bisa langsung mengganti tema seluruh situs web melalui pilihan DDL di MasterPage, karena properti Page.Theme disetel di PreInit(){}, jika tidak, kesalahan akan dilaporkan, dan MasterPage tidak akan dijalankan PraInit().
Saya harap contoh ini dapat membantu semua orang memecahkan masalah ini. Agar semua orang lebih memahami kode sumber saya, saya akan memperkenalkannya secara singkat di bawah.
Pertama mari kita bicara tentang idenya: Tujuan kita adalah untuk meletakkan DropDownList di MasterPage, dengan mengganti DropDownList (Saya tidak menggunakan DropDownList di sini, tetapi menggunakan Css untuk mensimulasikan "DropDownList" di mana LinkButton ditempatkan di setiap item, dan masing-masing LinkButtond Nilai PostBackUrl dalam bentuk: "~/ThemeTool.aspx?Theme=theme name" ) untuk mengubah tema seluruh situs web, bukan hanya mengubah halaman saat ini, seperti yang ada di Discuz!, jadi perubahan ini bersifat global, Tapi untuk thread saat ini, yaitu pengguna A mengubah tema, yang hanya efektif untuk pengguna A dan tidak berdampak pada pengguna B, jadi kami tidak akan menyentuh file konfigurasinya cepat pikirkan adalah sesi. Ya, kita perlu memasukkan nama tema di sesi tersebut, seperti Session["Theme"]="Blue"; dengan cara ini, setiap halaman hanya perlu memasukkan nilai Sesi tersebut Page_PreInit() dan tetapkan ke atribut Page.Theme halaman, dan itu akan baik-baik saja.
Ketika kita mengubah opsi "DropDowList", di sini saya sebenarnya mengklik tombol Tautan yang berbeda, yang berarti mengubah nama tema, yang berarti mengubah nilai Sesi["Tema"] "Ubah" ini Di mana menjalankannya? Ini sangat penting. Apakah di LinkButton_Click()? Tidak, karena mendapatkan kembali Page.Theme harus di Page_PreInit(), dan LinkButton_Click() terjadi sangat terlambat, setelah Load, apalagi PreInit(), jadi saya melompat ke ThemeTool Diproses di .aspx, dan kemudian diarahkan ke halaman asli setelah diproses, sehingga nilai Session["Theme"] diubah sebelum PreInit() dari halaman asli. Yakinlah bahwa proses ini tidak akan menyebabkan ThemeTool dimuat ke dalam browser baru saja meminjam Page_PreInit()-nya dan langsung pergi setelah menggunakannya, haha! !
Oke, itu idenya, mari kita perkenalkan tiga file berikutnya:
1. MasterPage.master, yang perlu disebutkan dalam file ini adalah "DropDownList" saya yang disimulasikan dengan CSS. Setiap item dari "DropDownList" memiliki LinkButton, dan nilai dari setiap PostBackUrl LinkButtond berbentuk: " ~/ThemeTool. aspx?Theme=Nama tema", sehingga setiap kali opsi "DropDownList" diubah, nilai Tema baru akan diteruskan ke ThemeTool.aspx, dan kemudian ThemeTool.aspx akan memproses nilai Tema baru dan menyimpannya di Sesi. .
2. Ada file ThemeSkin.cs di folder App_Code, yang berisi dua metode statis: GetTheme(Page P) dan GetTheme(Page P). GetTheme(Page P) digunakan untuk mendapatkan tema . Ini dipanggil di Page_PreInit() dari setiap halaman yang perlu memiliki tema (saya di sini Default.aspx dan Default2.aspx l). Parameter P merujuk ke halaman yang memanggil metode, yang merupakan objek tipe Halaman; ChangeTheme() digunakan untuk Mengganti tema yang dipanggil di Page_PreInit() dari ThemeTool.aspx.cs.
3. Halaman ThemeTool.aspx di direktori root juga sangat penting. Peralihan tema dilakukan di Page_PreInit-nya. Siapa yang menyuruh MasterPage untuk tidak menjalankan PreInit ^_^. Kode di dalamnya sangat sederhana. Jika Anda tidak percaya, lihatlah.
Memperluas