เนื่องจากมีคำถามเข้ามาเกี่ยวกับลำดับเหตุการณ์ที่เกิดขึ้นใน Page ซึ่งประกอบด้วย Master Page และ User Control ว่าเหตุการณ์ใดเกิดขึ้นก่อนหรือหลัง ผมจึงขออนุญาตอธิบายไว้ในบทความนี้ โดยจะอธิบายเหตุการณ์ต่างๆ ที่เกิดขึ้นในวงจรชีวิตของ Page และจะตอบคำถามในช่วงท้ายของบทความครับ
สำหรับนักพัฒนาเว็บไซต์ด้วย ASP.NET นั้นมักจะคุ้นเคยกับการเขียนชุดคำสั่งลงในเหตุการณ์ Load ของ Page กันดีอยู่แล้ว แต่ในการเรียกใช้ ASP.NET Page แต่ละครั้งนั้นจะมีลำดับขั้นของการประมวลผล ซึ่งจะเกิดเหตุการณ์ต่างๆ ประกอบกันเป็นวงจรชีวิตของ Page จึงเป็นเรื่องสำคัญที่นักพัฒนาต้องเข้าใจวงจรชีวิตของ Page ซึ่งจะทำให้สามารถเขียนชุดคำสั่งได้ถูกต้องและเหมาะสมกับเหตุการณ์ที่เกิดขึ้น
ตารางต่อไปนี้แสดงรายชื่อเหตุการณ์ที่เกิดขึ้นในวงจรชีวิตของ Page ซึ่งจะใช้กันค่อนข้างบ่อย
เหตุการณ์ของ Page | การนำไปใช้ |
---|---|
PreInit |
เกิดขึ้นหลังจาก Page ถูกสร้างแล้วและก่อนการกำหนดค่าเริ่มต้นของ Control ใช้เหตุการณ์นี้สำหรับทำสิ่งต่อไปนี้ได้
ข้อสังเกต
ถ้า Request เป็น PostBack ค่าของ Control จะยังไม่อ่านจาก View State ถ้ากำหนดคุณสมบัติของ Control ที่เหตุการณ์นี้ ค่าของ Control จะถูกเขียนทับในเหตุการณ์ถัดไป
|
Init |
เกิดขึ้นหลังจาก Control ทั้งหมดได้ถูกสร้างแล้วและ Skin ที่จัดเตรียมถูกนำไปใช้ เหตุการณ์ Init ของแต่ละ Control เกิดขึ้นก่อนเหตุการณ์ Init ของ Page
ใช้เหตุการณ์นี้อ่านหรือกำหนดคุณสมบัติเริ่มต้นของ Control
|
InitComplete |
เกิดขึ้นที่ตอนจบของการกำหนดค่าเริ่มต้นของ Page
ใช้เหตุการณ์นี้เพื่อเปลี่ยนค่า ViewState
|
PreLoad |
เกิดขึ้นหลังจาก Page ดึงค่า View State สำหรับ Page และ Control ทั้งหมด
|
Load |
เหตุการณ์ Load ของแต่ละ Control เกิดขึ้นหลังจากเหตุการณ์ Load ของ Page
ใช้เหตุการณ์ Load เพื่อกำหนดค่าให้กับคุณสมบัติต่างๆ ใน Control และสถาปนาการเชื่อมต่อฐานข้อมูล
|
Control Events |
ใช้เหตุการณ์เหล่านี้เพื่อเขียนชุดคำสั่งในเหตุการณ์ของ Control เช่น เหตุการณ์ Click ของปุ่มหรือเหตุการณ์ TextChanged ของกล่องข้อความ
ข้อสังเกต
ใน Request ที่เป็น PostBack ถ้า Page มี Validator Control ให้ตรวจสอบคุณสมบัติ IsValid ของ Page ก่อนการประมวลผลใดๆ
|
LoadComplete |
เกิดขึ้นหลังจากเหตุการณ์ของ Control ถูกประมวลผลแล้ว
ใช้เหตุการณ์นี้สำหรับงานที่ต้องการให้ Control อื่นทั้งหมดใน Page ผ่านเหตุการณ์ Load แล้ว
|
PreRender |
เกิดขึ้นหลังจาก Page ได้สร้าง Control ทั้งหมดแล้ว
เหตุการณ์ PreRender ของแต่ละ Control เกิดขึ้นหลังเหตุการณ์ PreRender ของ Page
ใช้เหตุการณ์นี้เพื่อทำการเปลี่ยนแปลงครั้งสุดท้ายให้กับเนื้อหาของ Page หรือ Control ก่อนเริ่มต้นการ Render
|
PreRenderComplete |
เกิดขึ้นหลังจาก Data Bound Control ซึ่งถูกกำหนดค่าให้กับคุณสมบัติ DataSourceID เรียกเมธอด DataBind
|
SaveStateComplete |
เกิดขึ้นหลังจาก View State และ Control State ถูกบันทึกเรียบร้อยแล้ว ความเปลี่ยนแปลงใดๆ ที่เกิดขึ้นกับ Page และ Control ที่จุดนี้จะมีผลต่อการ Render แต่ความเปลี่ยนแปลงจะไม่ถูกเรียกคืนมาใน PostBack ถัดไป
|
Render |
ขั้นตอนนี้ไม่ใช่เหตุการณ์ แต่ที่ขั้นตอนนี้ของการประมวลผล Page จะเรียกเมธอดนี้ในแต่ละ Control โดยที่ ASP.NET Web ServerControl ทั้งหมดมีเมธอด Render ซึ่งเขียน Markup ของ Control ส่งออกให้กับ Browser
|
Unload |
เกิดขึ้นกับแต่ละ Control ก่อนแล้วจึงเกิดขึ้นกับ Page
ใน Control ใช้เหตุการณ์นี้ทำการปล่อยทรัพยากรของระบบ เช่น การปิดการติดต่อกับฐานข้อมูลของ Control
สำหรับ Page ใช้เหตุการณ์นี้ทำการปล่อยทรัพยากรของระบบ เช่น การปิดไฟล์ที่เปิดไว้และการติดต่อฐานข้อมูล
ข้อสังเกต
ระหว่างเหตุการณ์ Unload ได้ผ่านขั้นตอนการ Render แล้ว ดังนั้นจึงไม่สามารถเปลี่ยนแปลง Response Stream ได้อีก ถ้ามีการเรียกเมธอด เช่น Response.Write จะมีความผิดพลาดเกิดขึ้น
|
สำหรับคำถามของเหตุการณ์ที่เกิดขึ้นใน Page ซึ่งประกอบด้วย Master Page และ User Control ว่าเหตุการณ์ใดเกิดขึ้นก่อนหรือหลัง เช่น เหตุการณ์ Load ของ Master Page และ User Control โดยลำดับที่เกิดขึ้นจะเป็นดังนี้ (เรียงลำดับตามเหตุการณ์ที่เกิดขึ้นก่อน-หลัง)
- Page_PreInit
- UserControl_Init
- MasterPage_Init
- Page_Init
- Page_InitComplete
- Page_PreLoad
- Page_Load
- MasterPage_Load
- UserControl_Load
- Button_Click (Control Events)
- Page_LoadComplete
- Page_PreRender
- MasterPage_PreRender
- UserControl_PreRender
- Page_PreRenderComplete
- Page_SaveStateComplete
- UserControl_Unload
- MasterPage_Unload
- Page_Unload
รูปภาพข้างล่างนี้แสดงลำดับการทำงานของเมธอดและเหตุการณ์ที่เกิดขึ้น
อ้างอิงจาก http://msdn.microsoft.com
No comments:
Post a Comment