Friday, August 16, 2013

วงจรชีวิตของ ASP.NET Page

เนื่องจากมีคำถามเข้ามาเกี่ยวกับลำดับเหตุการณ์ที่เกิดขึ้นใน Page ซึ่งประกอบด้วย Master Page และ User Control ว่าเหตุการณ์ใดเกิดขึ้นก่อนหรือหลัง ผมจึงขออนุญาตอธิบายไว้ในบทความนี้ โดยจะอธิบายเหตุการณ์ต่างๆ ที่เกิดขึ้นในวงจรชีวิตของ Page และจะตอบคำถามในช่วงท้ายของบทความครับ
สำหรับนักพัฒนาเว็บไซต์ด้วย ASP.NET นั้นมักจะคุ้นเคยกับการเขียนชุดคำสั่งลงในเหตุการณ์ Load ของ Page กันดีอยู่แล้ว แต่ในการเรียกใช้ ASP.NET Page แต่ละครั้งนั้นจะมีลำดับขั้นของการประมวลผล ซึ่งจะเกิดเหตุการณ์ต่างๆ ประกอบกันเป็นวงจรชีวิตของ Page จึงเป็นเรื่องสำคัญที่นักพัฒนาต้องเข้าใจวงจรชีวิตของ Page ซึ่งจะทำให้สามารถเขียนชุดคำสั่งได้ถูกต้องและเหมาะสมกับเหตุการณ์ที่เกิดขึ้น
ตารางต่อไปนี้แสดงรายชื่อเหตุการณ์ที่เกิดขึ้นในวงจรชีวิตของ Page ซึ่งจะใช้กันค่อนข้างบ่อย
 เหตุการณ์ของ Page การนำไปใช้
PreInit
เกิดขึ้นหลังจาก Page ถูกสร้างแล้วและก่อนการกำหนดค่าเริ่มต้นของ Control ใช้เหตุการณ์นี้สำหรับทำสิ่งต่อไปนี้ได้
  • ตรวจสอบคุณสมบัติ IsPostBack เพื่อตัดสินใจว่า Page ถูกประมวลผลครั้งแรก คุณสมบัติ IsCallBack และ IsCrossPagePostBack ถูกกำหนดค่าในเวลาเดียวกันด้วย
  • สร้าง Control แบบ Dynamic
  • กำหนด Master Page แบบ Dynamic
  • กำหนดคุณสมบัติ Theme แบบ Dynamic
  • อ่านหรือกำหนดค่าคุณสมบัติ Profile
ข้อสังเกต
ถ้า 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 
รูปภาพข้างล่างนี้แสดงลำดับการทำงานของเมธอดและเหตุการณ์ที่เกิดขึ้น
ASP.NET Page Life Cycle Diagram
อ้างอิงจาก http://msdn.microsoft.com

No comments:

Post a Comment