การเข้าถึงองค์ประกอบ .Net
บน Master Page จาก Content Page: คู่มือที่ครอบคลุม
ใน ASP.NET, Master page ให้วิธีการสร้างรูปแบบที่สม่ำเสมอสำหรับหน้าในแอปพลิเคชันเว็บ มันช่วยให้คุณกำหนดโครงสร้างทั่วไป เช่น หัวข้อ, ส่วนท้าย, และเมนูนำทาง ที่สามารถใช้ซ้ำในหลายๆ content page อย่างไรก็ตาม ความท้าทายทั่วไปที่นักพัฒนาประสบคือการ เข้าถึงองค์ประกอบบน Master page จาก Content page อย่างมีประสิทธิภาพ
ในบล็อกโพสต์นี้ เราจะสำรวจปัญหาจากสถานการณ์จริงเกี่ยวกับการเข้าถึงองค์ประกอบ ListView
บน Master page จาก Content page และดูวิธีแก้ปัญหาที่เป็นประโยชน์
ปัญหาที่ต้องเผชิญ
คุณอาจพบสถานการณ์ที่คุณต้องการอัปเดต ListView
บน Master page หลังจากมีการเปลี่ยนแปลงสำคัญใน Content page ตัวอย่างเช่น คุณมี ListView
ที่แสดงรายชื่อของผู้คนและต้องการให้มันรีเฟรชหลังจากมีการเพิ่มผู้ใหม่เข้าฐานข้อมูล
ข้อผิดพลาดที่เกิดขึ้น
เมื่อพยายามอ้างอิงถึง ListView
โดยตรงจาก Content page คุณอาจเจอข้อผิดพลาดของคอมไพเลอร์เช่นนี้:
"PeopleListView does not exist in the current context"
ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากควบคุม (เหมือนกับ ListView
) บน Master page ไม่สามารถเข้าถึงได้โดยตรงในโค้ดเบื้องหลังของ Content page
วิธีการแก้ไขที่เป็นไปได้
มาดูวิธีการสองสามวิธีในการแก้ไขปัญหานี้กัน
1. การใช้ FindControl
วิธีหนึ่งในการเข้าถึง ListView
บน Master page คือการใช้วิธี FindControl
อย่างไรก็ตาม วิธีนี้อาจก่อให้เกิดความท้าทาย เนื่องจากต้องการให้ Content page มีความรู้เกี่ยวกับโครงสร้างของ Master page ซึ่งขัดกับหลักการของการแยกความกังวล
การใช้งาน:
ในการค้นหาและเข้าถึง ListView คุณต้องรวมโค้ดตามนี้ในโค้ดเบื้องหลังของ Content page ของคุณ:
protected void AddNewPerson()
{
// เพิ่มบุคคลไปยังตาราง
....
// อัปเดตรายชื่อคน
var master = this.Master;
var peopleListView = (ListView)master.FindControl("PeopleListView");
if (peopleListView != null)
{
peopleListView.DataBind(); // อัปเดต ListView
}
...
}
วิธีนี้ใช้ได้ผล แต่สามารถนำไปสู่โค้ดที่มีการสัมพันธ์กันอย่างแน่นหนา ซึ่งไม่ใช่สิ่งที่เหมาะสมในแอปพลิเคชันที่ใหญ่ขึ้น
2. วิธีการตามเหตุการณ์
อีก ทางออกที่แข็งแกร่งกว่า คือการใช้เหตุการณ์ ในวิธีนี้คุณสามารถสร้างเหตุการณ์ใน Content page ที่ Master page จะฟังเหตุการณ์นี้ เมื่อคุณเรียกใช้เหตุการณ์นี้หลังจากเพิ่มบุคคลใหม่ Master page ก็สามารถจัดการกับตรรกะในการรีเฟรช ListView
ขั้นตอนการใช้งาน:
-
กำหนดเหตุการณ์ใน Content Page ของคุณ: ก่อนอื่นสร้างเหตุการณ์ในหน้า
GISInput_People.aspx.cs
ของคุณpublic event EventHandler PersonAdded; protected void AddNewPerson() { // เพิ่มบุคคลไปยังตาราง .... // เรียกใช้เหตุการณ์ PersonAdded?.Invoke(this, EventArgs.Empty); }
-
สมัครสมาชิกกับเหตุการณ์ใน Master Page: ในไฟล์โค้ดเบื้องหลังของ Master page ของคุณ สมัครสมาชิกกับเหตุการณ์เมื่อ Content page เริ่มต้น
protected void Page_Load(object sender, EventArgs e) { var contentPage = this.Page as GISInput_People; // ให้แน่ใจว่าการแคสต์ถูกต้อง if (contentPage != null) { contentPage.PersonAdded += UpdateListView; } } private void UpdateListView(object sender, EventArgs e) { PeopleListView.DataBind(); // รีเฟรช ListView }
สรุป
แม้ว่าการเข้าถึงองค์ประกอบบน Master page จาก Content page ใน ASP.NET อาจดูยุ่งยากในตอนแรก การใช้เหตุการณ์จะช่วยให้การจัดการการโต้ตอบระหว่างทั้งสองเป็นไปอย่างสะอาดและมีประสิทธิภาพ วิธีนี้ไม่เพียงส่งเสริมการแยกความกังวลที่ดีกว่า แต่ยังมั่นใจได้ว่าโค้ดของคุณยังคงรักษาความนำไปใช้ได้เมื่อโครงการขยายตัว
โดยการทำตามขั้นตอนที่อธิบายไว้ในบล็อกโพสต์นี้ คุณควรจะมีพื้นฐานที่มั่นคงในการเข้าถึงและปรับปรุงองค์ประกอบใน Master page โดยไม่สะดุดจากภายใน Content pages ในแอปพลิเคชัน ASP.NET ของคุณ
หากคุณมีคำถามหรือความช่วยเหลือเพิ่มเติมเกี่ยวกับโครงการ ASP.NET ของคุณ อย่าลังเลที่จะติดต่อเรา!