ASP.Net มีสกินธีมซึ่งจริงๆ แล้วเป็นการเปลี่ยนแปลงสกิน อย่างไรก็ตาม ผู้คนจำนวนมากบนอินเทอร์เน็ตบอกว่าสิ่งนี้ไร้ประโยชน์ โดยบอกว่าสิ่งนี้สามารถใช้ได้ในหน้า .aspx แต่ไม่สามารถใช้ในหน้าต้นแบบ (MasterPage) ใช่ เป็นเรื่องจริงที่คุณไม่สามารถสลับธีมของเว็บไซต์ทั้งหมดได้โดยตรงผ่านการเลือก DDL ใน MasterPage เนื่องจากคุณสมบัติ Page.Theme ถูกตั้งค่าไว้ใน PreInit(){} ไม่เช่นนั้นระบบจะรายงานข้อผิดพลาด และ MasterPage จะไม่ดำเนินการ เริ่มต้น()
ฉันหวังว่าตัวอย่างนี้จะช่วยให้ทุกคนแก้ไขปัญหานี้ได้ เพื่อให้ทุกคนเข้าใจซอร์สโค้ดของฉันได้ดีขึ้น ฉันจะแนะนำมันสั้นๆ ด้านล่างนี้
ก่อนอื่น เรามาพูดถึงแนวคิดนี้กันก่อน: จุดประสงค์ของเราคือการใส่ DropDownList ลงใน MasterPage โดยการสลับ DropDownList (ฉันไม่ได้ใช้ DropDownList ที่นี่ แต่ใช้ Css เพื่อจำลอง "DropDownList" ซึ่งมี LinkButton วางอยู่ในแต่ละรายการ และ แต่ละ LinkButtond ค่าของ PostBackUrl อยู่ในรูปแบบ: "~/ThemeTool.aspx?Theme=theme name" ) เพื่อเปลี่ยนธีมของทั้งเว็บไซต์ แทนที่จะเปลี่ยนแค่หน้าปัจจุบันเหมือนกับอันหนึ่งของ Discuz! ดังนั้น การเปลี่ยนแปลงนี้เป็นแบบโกลบอล แต่สำหรับเธรดปัจจุบัน นั่นคือ ผู้ใช้ A เปลี่ยนธีม ซึ่งมีผลเฉพาะกับผู้ใช้ A และไม่มีผลกระทบต่อผู้ใช้ B ดังนั้นเราจะไม่แตะต้องไฟล์การกำหนดค่า แล้วสิ่งที่เราจะทำ คิดอย่างรวดเร็วว่าคือ session ใช่แล้ว เราต้องใส่ชื่อของธีมใน session เช่น Session["Theme"]="Blue"; ด้วยวิธีนี้ แต่ละเพจจะต้องรับค่าของ Session เข้าไปเท่านั้น Page_PreInit() และกำหนดให้กับแอตทริบิวต์ Page.Theme ของเพจ และมันจะไม่เป็นไร
เมื่อเราเปลี่ยนตัวเลือก "DropDowList" ที่นี่ฉันจะคลิกที่ปุ่ม Link อื่นซึ่งหมายถึงการเปลี่ยนชื่อของธีมซึ่งหมายถึงการเปลี่ยนค่าของเซสชัน ["ธีม"] นี้ "เปลี่ยน" จะดำเนินการที่ไหน? สิ่งนี้สำคัญมาก มันอยู่ใน LinkButton_Click() หรือไม่? ไม่ เนื่องจากการรับ Page.Theme อีกครั้งจะต้องอยู่ใน Page_PreInit() และ LinkButton_Click() เกิดขึ้นช้ามาก หลังจากโหลด ไม่ต้องพูดถึง PreInit() ดังนั้นฉันจึงข้ามไปที่ ThemeTool ที่นี่ ประมวลผลใน .aspx แล้วเปลี่ยนเส้นทางไปยังหน้าเดิม หลังจากประมวลผลแล้ว ดังนั้นค่าของ Session["Theme"] จะถูกเปลี่ยนก่อน PreInit() ของหน้าเดิม โปรดมั่นใจได้ว่ากระบวนการนี้จะไม่ทำให้ ThemeTool ถูกโหลดเข้าสู่เบราว์เซอร์ ซึ่งเรามองไม่เห็น เพิ่งยืม Page_PreInit() มาใช้แล้วออกไปทันที 555! -
เอาล่ะ นั่นคือแนวคิด ขอแนะนำไฟล์สามไฟล์ถัดไป:
1. MasterPage.master สิ่งที่ควรกล่าวถึงในไฟล์นี้คือ "DropDownList" ของฉันจำลองด้วย CSS แต่ละรายการใน "DropDownList" มี LinkButton และค่าของ PostBackUrl ของ LinkButtond แต่ละรายการอยู่ในรูปแบบ: " ~/ThemeTool. aspx?Theme=Theme name" ดังนั้นทุกครั้งที่มีการเปลี่ยนแปลงตัวเลือก "DropDownList" ค่า Theme ใหม่จะถูกส่งไปยัง ThemeTool.aspx จากนั้น ThemeTool.aspx จะประมวลผลค่า Theme ใหม่และจัดเก็บไว้ในเซสชัน .
2. มีไฟล์ ThemeSkin.cs อยู่ในโฟลเดอร์ App_Code ซึ่งมีวิธีการคงที่สองวิธี: GetTheme(Page P) และ GetTheme(Page P) ใช้รับธีมนี้บนเว็บไซต์ มันถูกเรียกใน Page_PreInit() ของทุกเพจที่จำเป็นต้องมีธีม (ฉันอยู่ที่นี่ Default.aspx และ Default2.aspx l) พารามิเตอร์ P อ้างถึงเพจที่เรียกใช้เมธอด ซึ่งเป็นออบเจ็กต์ประเภทเพจ ChangeTheme() ใช้ในการสลับธีมเรียกว่าใน Page_PreInit() ของ ThemeTool.aspx.cs
3. หน้า ThemeTool.aspx ในไดเร็กทอรีรากก็มีความสำคัญเช่นกัน การสลับธีมเสร็จสิ้นใน Page_PreInit ใครบอก MasterPage ว่าอย่ารัน PreInit? รหัสภายในนั้นง่ายมาก หากคุณไม่เชื่อฉันลองดู
ขยาย