วันอังคารที่ 19 มีนาคม พ.ศ. 2556

ความรู้พื้นฐาน ASP.NET ตอน วงจรชีวิตของเว็บฟอร์ม


  เมื่อไคลเอนต์มีการร้องขอไฟล์แบบไดนามิคไปที่ IIS การเรียกนี้จะถูกส่งต่อไปให้กับ aspnet_isapi.dll จากนั้นจะส่งผ่านเป็นทอดๆ ให้กับ HTTP Module และสุดท้ายก็จะมาทำงานที่ HTTP Handler ที่เป็นตัวรันเว็บฟอร์ม ดังภาพที่ 5-1
5-1.jpg
ภาพที่ 5-1 การจัดการกับการเรียกไปยังเว็บฟอร์มของ IIS
        เมื่อการร้องขอไฟล์เว็บฟอร์มมาถึง HTTP Handler ของเว็บฟอร์ม และจะมีการเรียกเมธอด ProcessRequest และเข้าสู่วงจรชีวิตของเว็บฟอร์มดังภาพที่ 5-2
5-2.jpg
ภาพที่ 5-2 วงจรชีวิตของเว็บฟอร์ม
        จากภาพที่ 5-2 เราจะแบ่งขั้นตอนการทำงานย่อยของเมธอด ProcessRequest ออกได้เป็น 8 ขั้นตอนดังนี้

ขั้นตอนที่ 1 Instantiation
ในขึ้นตอนนี้ ASP .NET จะมีการสร้างอ็อปเจ็กต์ของเว็บฟอร์มขึ้นมาโดยอัตโนมัติ ไม่ว่าเว็บฟอร์มของเราจะมีโค้ดแบบ Inline หรือ Code Behind ก็ตาม โดย ASP.NET จะเข้าไปทำการอ่านแท็กต่างๆ ที่อยู่ในมุมมองของ Source ในไฟล์ .aspx แล้วทำการสร้างอ็อปเจ็กต์เว็บฟอร์มขึ้นมาก่อน จากนั้น จึงทำการสร้างอ็อปเจ็กต์ของคอนโทรลแต่ละตัวที่อยู่ในเว็บฟอร์ม
ขั้นตอนที่ 2 Initialization
หลังจากที่มีการสร้างลำดับชั้นของคอนโทรลเสร็จแล้ว จะเข้ามาในส่วนของเหตุการณ์เริ่มต้น (Initialization) ของทั้งเว็บฟอร์ม และของคอนโทรลภายในเว็บฟอร์ม เหตุการณ์นี้ตรงกับเมธอด OnInit ของทั้งเว็บฟอร์ม และคอนโทรล โดยเมธอด OnInit ของคอนโทรลจะถูกเรียกก่อนจนครบทุกตัว จากนั้นจึงทำการเรียกเมธอด OnInit ของเว็บฟอร์ม
สำหรับเมธอด OnInit ของเว็บฟอร์ม เราสามารถเห็นเมธอดนี้ได้ ในตอนที่เพิ่มเว็บฟอร์มเข้ามาใหม่ในโปรเจคของ Visual Studio .NET 2003 เราจะสังเกตุเห็นส่วนของ Web Form Designer generated code ซึ่งถ้าคลิกเข้าไปดูภายในจะพบว่ามีเมธอด OnInit อยู่ภายใน และเราสามารถเข้าไปเขียนโค้ดเพิ่มเติมในส่วนนี้ได้ แต่สำหรับ Visual Studio 2005 ส่วนนี้จะถูกซ่อนไว้ ถ้าหากเราต้องการเขียนโค้ดเพิ่มในส่วนนี้เราต้องเพิ่มเมธอด OnInit นี้เข้าไปเองดังโค้ดตัวอย่างที่ 5-4
VB

 Protected Sub Page_Init(ByVal sender As Object, _
                       ByVal e As System.EventArgs) Handles Me.Init

        Me.OnInit(e)
        ‘ Add your custom Init here
        ...

 End Sub
C#

protected override void OnInit(EventArgs e){
      base.OnInit(e);
      //Add your custom OnInit here
      …}
โค้ดตัวอย่างที่ 5-4 ตัวอย่างการสร้างเมธอด OnInit ของเว็บฟอร์ม

ขั้นตอนที่ 3 โหลด View State
การโหลดค่าจาก View State จะทำเฉพาะตอนที่เว็บฟอร์มมีการ Post back เท่านั้น ในขั้นตอนนี้ ASP .NET จะทำการโหลดค่าจาก View State แล้วนำค่านี้ไปกำหนดให้กับคอนโทรลในเว็บฟอร์มตามลำดับชั้นของอ็อปเจ็กต์เว็บฟอร์ม และคอนโทรลในเว็บฟอร์ม สำหรับค่าใน View State นี้ บางครั้งอาจถูกแก้ไขโดยแฮกเกอร์ได้ เพื่อมีเจตนาที่ไม่ดีบางอย่าง ในบทถัดไปจะได้เรียนรู้ถึงวิธีการป้องกัน การแก้ไขข้อมูลใน View State
ขั้นตอนที่ 4 โหลด Post Back Data
จะเกิดเมื่อเว็บฟอร์มมีการ Post back เท่านั้น ขั้นตอนนี้เว็บฟอร์ม จะทำการโหลดค่าจาก HTTP POST Headers แล้วส่งต่อค่าที่เหมาะสมให้กับเซิร์ฟเวอร์คอนโทรลแต่ละตัวที่ทำการอิมพลีเมนต์อินเตอร์เฟส IPostBackDataHandler หลังจากนั้นเซิร์ฟเวอร์คอนโทรลจะทำการเรียกเมธอด LoadPostData เพื่อดึงค่าที่เว็บฟอร์มส่งให้ไปกำหนดพร็อพเพอตี้ Text ให้ตัวเอง ตัวอย่างของการโหลดค่าในขั้นตอนนี้ดังภาพที่ 5-5
5-5.jpg
ภาพที่ 5-5 ตัวอย่างแสดงขั้นตอนการโหลดค่าจากการ Post Back
จากภาพที่ 5-5 มีขั้นตอนการโหลดค่าจากการ Post Back ดังนี้
1.       ไคลเอนต์ร้องขอไฟล์เว็บฟอร์ม ซึ่งบรรจุคอนโทรล Textbox เพื่อให้กรอกข้อความ และคอนโทรล Button ซึ่งเป็นปุ่มที่ทำให้เกิดการ Post Back ไปที่เซิร์ฟเวอร์ โดยไม่มีส่วนของโค้ดที่แก้ไขค่าในคอนโทรล TextBox เลย
2.       เมื่อการ Post Back มาถึงที่เว็บเซิร์ฟเวอร์ เว็บฟอร์มจะถูกรันขึ้นมา และเมื่อถึงขั้นตอนการโหลด Post Back Data เว็บฟอร์มตรวจดูว่ามีคอนโทรลตัวใดที่ทำการอิมพลีเมนต์อินเตอร์เฟส IPostBackDataHandler บ้าง ซึ่งในที่นี้มีเพียงคอนโทรล TextBox เท่านั้น จากนั้นเว็บฟอร์มจะทำการอ่านจาก HTTP POST Headers เฉพาะที่เป็นของ TextBox แล้วนำค่าที่ได้ไปกำหนดให้กับพรอบเพอตี้ Text ซึ่งในที่นี้ก็คือคำว่า “Hello World”
3.       เมื่อรันเว็บฟอร์มครบทุกขั้นตอนแล้ว ก็จะส่งผลลัพธ์คืนกลับไปที่ไคลเอนต์ ที่ไคลเอนต์จะเห็นว่าค่าใน TextBox นี้ จะพบคำว่า “Hello World” เหมือนกับสถานะตอนที่มีการ Post Back ไปที่เว็บเซิร์ฟเวอร์
เพิ่มเติม สำหรับคอนโทรลที่มีการอิมพลีเมนต์อินเตอร์เฟส IPostBackDataHandler มักจะเป็นคอนโทรลที่เราสามารถกรอกค่า หรือแก้ไขค่าได้จากฝั่งไคลเอนต์ เช่น คอนโทรล TextBox คอนโทรล DropDownList สำหรับคอนโทรลเหล่านี้ แม้ว่าเราจะกำหนดพรอบเพอตี้ EnableViewState ให้เป็นเท็จแล้วก็ตาม คอนโทรลเหล่านี้ก็ยังสามารถจำค่าที่กำหนดจากทางฝั่งไคลเอนต์ได้ เพราะคอนโทรลเหล่านี้โหลดค่าจาก Post Back มาใช้
ขั้นตอนที่ 5 Load
เมธอดนี้เป็นของเว็บฟอร์ม ซึ่งนักพัฒนาเว็บจะรู้จักเป็นอย่างดี เหตุการณ์นี้ตรงกับเหตุการณ์ในโพรซีเยอร์ Page_Load ขั้นตอนนี้จะถูกเรียกทั้งตอนที่มีการ Post Back และไม่มีการ Post Back

ขั้นตอนที่ 6 Raise Post Back Event

เป็นเหตุการณ์ที่เกิดกับคอนโทรลที่มีความสามารถในการ Post Back ได้เช่น เหตุการณ์ Click ของ Button เหตุการณ์ TextChanged ของคอนโทรล TextBox คอนโทรลที่สามารถสร้างการ Post Back ได้นั้นต้องมีการอิมพลีเมนต์อินเตอร์เฟส IPostBackDataHandler ที่เราได้รู้จักกันไปแล้ว

ขั้นตอนที่ 7 Save View State

ขั้นตอนนี้เว็บฟอร์มจะเรียกเมธอด SaveViewState ของคอนโทรลแต่ละตัวที่อยู่ภายใต้เว็บฟอร์มตามลำดับชั้น เพื่อทำการบันทึกสถานะของคอนโทรลล่าสุดที่อาจมีการการเปลี่ยนแปลงไป เนื่องจากขั้นตอนก่อนหน้านี้ ผลของการบันทึกนี้จะถูกเก็บอยู่ในรูปตัวหนังสือที่เข้ารหัสแบบ Base-64 แล้วเก็บใน Hidden Field ที่จะถูกสร้างในขั้นตอนถัดไป

ขั้นตอนที่ 8 Render

ขั้นตอนนี้ เว็บฟอร์มจะทำการแปลงข้อมูลในขั้นตอนที่ผ่านมาออกมาในรูปภาษา HTML เพื่อส่งต่อให้กับไคลเอนต์ ในขั้นตอนนี้เว็บฟอร์มจะเรียกเมธอด RenderControl ของคอนโทรลแต่ละตัวที่อยู่ภายใต้เว็บฟอร์มตามลำดับชั้น สำหรับ
ขั้นตอนทั้ง 8 ที่กล่าวมานี้ เป็นขั้นตอนที่สำคัญที่มีความเกี่ยวข้องกับ View State ซึ่งได้ละขั้นตอน PreInit ขั้นตอนPreRender และขั้นตอน Unload ไว้

ที่มา http://www.aspnetthai.com

0 ความคิดเห็น: