ในแอปพลิเคชัน ASP.NET มีหลายวิธีในการนำทางระหว่างเว็บฟอร์ม: การใช้ไฮเปอร์ลิงก์ การใช้ Response.Redirect การใช้ Server.Transfer หรือใช้ Server.Execute บทความนี้จะวิเคราะห์ความเหมือน ความแตกต่าง ข้อดีและข้อเสียของวิธีการนำทางทั้งสี่นี้ เพื่อช่วยคุณเลือกวิธีการนำทางที่ดีที่สุด
1. ไฮเปอร์ลิงก์
วิธีที่ง่ายที่สุดในการใส่ฟอร์มอื่นจากฟอร์มเดียวคือการใช้ตัวควบคุมไฮเปอร์ลิงก์ HTML ในรูปแบบเว็บ ให้ใช้คลาสโค้ด HTML ของไฮเปอร์ลิงก์ เช่น:
<a href="WebForm2.aspx">ป้อนฟอร์ม 2</a>
เมื่อผู้ใช้คลิกไฮเปอร์ลิงก์ WebForm2.aspx จะถูกดำเนินการ และผลลัพธ์จะถูกส่งไปยัง เบราว์เซอร์ การนำทางแบบไฮเปอร์ลิงก์สามารถใช้ได้เกือบทุกที่ รวมถึงเพจ HTML และเพจ ASP ทั่วไป ASP.NET ยังมีวิธีอื่นอีกวิธีหนึ่ง นั่นคือการควบคุมเซิร์ฟเวอร์ HyperLink:
<form id="Form1" method="post" runat="server">
<asp:HyperLink id="HyperLink1" runat=" server"
NavigateUrl="WebForm2 .aspx">ป้อนแบบฟอร์ม 2</asp:HyperLink>
</form>
ผลลัพธ์การทำงานของโค้ด HTML ด้านบนจะเหมือนกับตัวอย่างแรก เนื่องจาก ASP.NET ถือว่าการควบคุมเว็บเซิร์ฟเวอร์ของ HyperLink เป็นตัวควบคุม HTML super Link แต่มีความแตกต่างที่สำคัญประการหนึ่งระหว่างทั้งสองคือ การควบคุมเว็บเซิร์ฟเวอร์ของ HyperLink สามารถตั้งโปรแกรมบนฝั่งเซิร์ฟเวอร์ได้ โดยเฉพาะอย่างยิ่ง คุณสมบัติ NavigateUrl สามารถเปลี่ยนแปลงได้ในโค้ดโปรแกรม ช่วยให้สามารถสร้างไฮเปอร์ลิงก์ที่มีเป้าหมายเฉพาะที่สามารถเปลี่ยนแปลงแบบไดนามิกตามสถานะปัจจุบันของแอปพลิเคชัน ตัวอย่างเช่น:
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
HyperLink1.NavigateUrl = "WebForm3.aspx"
End Sub
หลังจากที่โค้ดนี้ถูกดำเนินการ ถ้าผู้ใช้คลิกที่ลิงก์ เขาจะเห็น WebForm3.aspx แทน WebForm2.aspx
2. ใช้โปรแกรมเพื่อควบคุมการเปลี่ยนเส้นทาง
แม้ว่าไฮเปอร์ลิงก์จะสามารถนำทางจากหน้าหนึ่งไปยังอีกหน้าหนึ่งได้ แต่ผู้ใช้จะควบคุมวิธีการนำทางนี้อย่างสมบูรณ์ บางครั้งเราอาจจำเป็นต้องใช้โค้ดเพื่อควบคุมกระบวนการนำทางทั้งหมด รวมถึงเวลาที่จะไปยังหน้าอื่น ในสถานการณ์เหล่านี้ ASP.NET มีสามวิธีที่แตกต่างกันเพื่อให้บรรลุวัตถุประสงค์ที่คล้ายกัน: การเรียกวิธีการเปลี่ยนเส้นทางของวัตถุการตอบสนอง และการเรียกวิธีการถ่ายโอนหรือดำเนินการของวัตถุเซิร์ฟเวอร์ ลักษณะการทำงานของวิธีการนำทางทั้งสามวิธีนี้โดยพื้นฐานแล้วจะคล้ายกัน แต่ก็มีความแตกต่างกัน
2.1 Response.Redirect
วิธีการ Response.Redirect ทำให้เบราว์เซอร์เชื่อมโยงไปยัง URL ที่ระบุ เมื่อเรียกใช้เมธอด Response.Redirect() เมธอดจะสร้างการตอบกลับด้วยรหัสสถานะ 302 (บ่งชี้ว่าเป้าหมายมีการเปลี่ยนแปลง) และ URL เป้าหมายใหม่ในส่วนหัวของการตอบกลับ เบราว์เซอร์ได้รับการตอบกลับจากเซิร์ฟเวอร์และใช้ข้อมูลในส่วนหัวการตอบกลับเพื่อออกคำขอ URL ใหม่
กล่าวคือ เมื่อใช้เมธอด Response.Redirect การดำเนินการเปลี่ยนเส้นทางจะเกิดขึ้นในฝั่งไคลเอ็นต์และเกี่ยวข้องกับการสื่อสารทั้งหมดสองครั้งกับเซิร์ฟเวอร์ (การส่งข้อมูลไปกลับสองครั้ง): รายการแรกเป็นการร้องขอสำหรับเพจต้นฉบับ ซึ่งได้รับ 302 และครั้งที่สอง ครั้งที่สองคือการขอเพจใหม่ที่ประกาศในการตอบกลับ 302 และรับเพจหลังจากการเปลี่ยนเส้นทาง
2.2 Server.Transfer
วิธีการ Server.Transfer ถ่ายโอนโฟลว์การดำเนินการจากไฟล์ ASPX ปัจจุบันไปยังเพจ ASPX อื่นบนเซิร์ฟเวอร์เดียวกัน เมื่อเรียก Server.Transfer การดำเนินการของเพจ ASPX ปัจจุบันจะสิ้นสุดลง และโฟลว์การดำเนินการจะถูกโอนไปยังเพจ ASPX อื่น แต่เพจ ASPX ใหม่ยังคงใช้สตรีมการตอบสนองที่สร้างโดยเพจ ASPX ก่อนหน้า
หากคุณใช้เมธอด Server.Transfer เพื่อนำทางระหว่างเพจต่างๆ URL ในเบราว์เซอร์จะไม่เปลี่ยนแปลง เนื่องจากการเปลี่ยนเส้นทางจะดำเนินการอย่างสมบูรณ์บนฝั่งเซิร์ฟเวอร์ และเบราว์เซอร์ไม่ทราบว่าเซิร์ฟเวอร์ได้ทำการเปลี่ยนแปลงเพจแล้ว
ตามค่าเริ่มต้น วิธีการ Server.Transfer จะไม่ส่งข้อมูลแบบฟอร์มหรือสตริงการสอบถามจากหน้าหนึ่งไปยังอีกหน้าหนึ่ง แต่ตราบเท่าที่พารามิเตอร์ตัวที่สองของวิธีการถูกตั้งค่าเป็น True ข้อมูลแบบฟอร์มของหน้าแรกก็สามารถรักษาและสอบถามได้ เชือก
ขณะเดียวกัน สิ่งหนึ่งที่ควรสังเกตเมื่อใช้ Server.Transfer คือ หน้าเป้าหมายจะใช้สตรีมการตอบสนองที่สร้างโดยหน้าเดิม ซึ่งทำให้ Machine Authentication Check (MAC) ของ ASP.NET คิดว่า ViewState ของหน้าใหม่ ได้รับการดัดแปลง ดังนั้น หากคุณต้องการเก็บข้อมูลฟอร์มและคอลเลกชันสตริงแบบสอบถามของเพจต้นฉบับ คุณต้องตั้งค่าคุณสมบัติ EnableViewStateMac ของคำสั่งเพจของเพจเป้าหมายเป็นเท็จ
2.3 Server.Execute
วิธีการ Server.Execute อนุญาตให้เพจ ASPX ปัจจุบันดำเนินการเพจ ASPX ที่ระบุบนเว็บเซิร์ฟเวอร์เดียวกัน เมื่อมีการดำเนินการเพจ ASPX ที่ระบุ ขั้นตอนการควบคุมจะกลับไปยังตำแหน่งที่เพจต้นฉบับออก Server.Execute เรียก.
วิธีการนำทางเพจนี้คล้ายกับการเรียกใช้ฟังก์ชันสำหรับเพจ ASPX เพจที่ถูกเรียกสามารถเข้าถึงข้อมูลฟอร์มและคอลเลกชันสตริงแบบสอบถามของเพจการเรียก ดังนั้นคุณสมบัติ EnableViewStateMac ของคำสั่งเพจของเพจที่ถูกเรียกต้องถูกตั้งค่าเป็นเท็จ
ตามค่าเริ่มต้น ผลลัพธ์ของเพจที่ถูกเรียกจะถูกผนวกเข้ากับสตรีมการตอบกลับปัจจุบัน อย่างไรก็ตาม วิธีการ Server.Execute มีวิธีการโอเวอร์โหลดที่อนุญาตให้รับเอาต์พุตของเพจที่ถูกเรียกผ่านวัตถุ TextWriter (หรือวัตถุย่อย เช่น วัตถุ StringWriter) แทนที่จะต่อท้ายโดยตรงกับสตรีมเอาต์พุต ดังนั้น ว่าในหน้าเดิม คุณสามารถปรับตำแหน่งของผลลัพธ์ผลลัพธ์ของหน้าที่เรียกได้อย่างง่ายดาย
เพื่อแสดงให้เห็นกระบวนการทำงาน เรามาสร้างเว็บฟอร์ม ใส่ตัวควบคุมปุ่ม (Button1) และตัวควบคุมข้อความ (Literal1) สลับไปที่มุมมองโค้ดในอินเทอร์เฟซการออกแบบ เพิ่มคำสั่ง Imports ของเนมสเปซ System.IO และ จากนั้นเพิ่มโค้ดที่ดำเนินการเมื่อผู้ใช้คลิกปุ่ม:
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim sw As StringWriter = New StringWriter()
Server.Execute( "WebForm2.aspx", sw)
Literal1.Text = sw.ToString()
End Sub
จากนั้นสร้างหน้าที่สอง WebForm2.aspx สำหรับเว็บแอปพลิเคชันเดียวกัน ไปที่มุมมอง HTML ของเพจและแก้ไขคำสั่งเพจเพื่อปิดใช้งานการตรวจสอบ ViewState:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm2.aspx.vb"
Inherits="Navigate.WebForm2" EnableViewStateMac= "false "%>
ไปที่มุมมองการออกแบบอีกครั้งและเพิ่มการควบคุมลงในหน้าที่ 2 จากนั้น ให้ตั้งค่าหน้าแรกเป็นหน้าเริ่มต้นและเริ่มแอปพลิเคชัน คลิกปุ่ม และตัวควบคุมของ WebForm2 จะแสดงในตำแหน่งที่ปุ่ม Literal วางอยู่ใน WebForm1 ดังแสดงในรูปที่ 1 โปรดทราบว่าชื่อเพจและ URL ยังคงแสดงเพจดั้งเดิม WebForm1
รูปที่ 1: ใช้ Server.Execute เพื่อรวมไฟล์ต้นฉบับสองไฟล์เข้าด้วยกัน
เมื่อใช้เมธอด Server.Transfer หรือ Server.Execute เพื่อใช้การนำทาง สิ่งหนึ่งที่ควรทราบ: หน้าสุดท้ายอาจไม่ใช่หน้า HTML ที่ถูกกฎหมาย เนื่องจากท้ายที่สุดแล้วหน้าดังกล่าวจึงกลับมาที่ ลูกค้าอาจมีแท็ก <HTML> และ <BODY> หลายแท็ก ดูเหมือนว่า Internet Explorer จะยอมรับและจัดการกับสถานการณ์นี้ได้อย่างถูกต้อง แต่ถ้าคุณต้องการใช้เบราว์เซอร์อื่น คุณควรทดสอบอย่างระมัดระวัง
3. การเปรียบเทียบและการเลือก
เนื่องจากมีหลายวิธีในการนำทางจากหน้าหนึ่งไปยังอีกหน้าหนึ่ง คุณควรเลือกวิธีการนำทางที่ดีที่สุดอย่างไร ต่อไปนี้เป็นปัจจัยบางประการที่ควรพิจารณา:
·ไฮเปอร์ลิงก์เหมาะที่สุดหากคุณต้องการให้ผู้ใช้ตัดสินใจว่าจะเปลี่ยนหน้าเมื่อใดและจะไปที่หน้าใด
·หากคุณต้องการใช้โปรแกรมเพื่อควบคุมเป้าหมายการแปลง แต่ผู้ใช้กำหนดระยะเวลาของการแปลง ให้ใช้การควบคุมไฮเปอร์ลิงก์ของเว็บเซิร์ฟเวอร์เพื่อตั้งค่าคุณสมบัติ NavigateUrl แบบไดนามิก
·หากคุณต้องการเชื่อมต่อผู้ใช้กับทรัพยากรบนเซิร์ฟเวอร์อื่น ให้ใช้ Response.Redirect
· ใช้ Response.Redirect เพื่อเชื่อมต่อผู้ใช้กับทรัพยากรที่ไม่ใช่ ASPX เช่น หน้า HTML
· หากคุณต้องการเก็บสตริงการสืบค้นไว้เป็นส่วนหนึ่งของ URL ให้ใช้ Response.Redirect
·หากคุณต้องการถ่ายโอนกระบวนการดำเนินการไปยังเพจ ASPX อื่นบนเว็บเซิร์ฟเวอร์เดียวกัน คุณควรใช้ Server.Transfer แทน Response.Redirect เนื่องจาก Server.Transfer สามารถหลีกเลี่ยงการสื่อสารผ่านเครือข่ายที่ไม่จำเป็น จึงได้รับประสิทธิภาพที่ดีขึ้นและเอฟเฟกต์การสืบค้น
· หากคุณต้องการบันทึกผลลัพธ์เอาต์พุตของเพจ ASPX หนึ่งเพจ จากนั้นแทรกผลลัพธ์ลงในเพจ ASPX อื่นในตำแหน่งเฉพาะ ให้ใช้ Server.Execute
·หากคุณต้องการให้แน่ใจว่าเอาต์พุต HTML นั้นถูกกฎหมาย โปรดใช้ Response.Redirect อย่าใช้เมธอด Server.Transfer หรือ Server.Execute
บทความนี้แปลจาก: http://www.ondotnet.com/pub/a/dotnet/2003/04/07/aspnetnav.html